我有一个 wpf 应用程序,MVVM 风格,带有 (Telerik Rad)Gridview。我希望每次用户更新单元格时都有一个事件。
网格视图绑定到 MyRowModel
public class MyRowModel : INotifyPropertyChanged
{
//...
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
我想在我的视图模型中处理它们,我像这样绑定它们
var rows = MyRows.ForEach(p=> p.PropertyChanged += MyPropertyChangedHandler);
这有效,但我需要在某处取消绑定事件吗?用户可以从此视图向后移动,并选择另一组行。此外,每次单元格更改时,我都会从施维雅获得更新的行。
2、奖金问题) 这些(在我的例子中是MyRowModel)视图模型还是模型?
但是我需要在某处取消绑定事件吗?
这取决于所涉及的对象的生存期。如果不希望MyRowModel
对象在离开视图模型时阻止对其进行垃圾回收,则应在视图Unloaded
时注销事件处理程序,并在视图Loaded
时注册它们:
MyRows.ForEach(p=> p.PropertyChanged -= MyPropertyChangedHandler);
如果项是动态添加到MyRows
和从中删除的,则还应检测何时发生这种情况,并相应地注册和注销事件处理程序。如果MyRows
是ObservableCollection<T>
,则可以处理CollectionChanged
事件。
如果考虑使用弱事件,则还应考虑使用WeakEventManager
运算符和+=
运算符挂接事件处理程序之间的语义差异。