【问题标题】:WPF Unbinding OnPropertyChanged-events [closed]WPF 解除绑定 OnPropertyChanged 事件 [关闭]
【发布时间】:2020-07-06 07:54:24
【问题描述】:

我有一个 MVVM 风格的 wpf 应用程序,带有 (Telerik Rad)Gridview。我希望每次用户更新单元格时都有一个事件。

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);

这可行,但我需要在某处取消绑定事件吗?用户可以从此视图返回,并选择另一组行。此外,每次发生单元格更改时,我都会从 servier 获取更新的行。

2,奖金问题) 这些(在我的情况下为 MyRowModel )是视图模型还是模型?

【问题讨论】:

  • 试试WeakEvent。您可以使用 WPF 实现或开源。最后,您可以自己实现。这不是魔法。
  • 问题 1. 当您从 GridView 删除/删除任何行时,分离这些事件。问题 2. 这些 ViewModel 是 Models,因为它们没有任何关联的 View
  • 感谢您的回答。我会检查我可以在哪里分离事件并检查弱事件。好的,称它们为模型是有道理的,因为它们没有视图
  • @Cowborg MyRows 是什么类型?你如何绑定MyRows,你能显示XAML吗?这是如何完成的用户可以从这个视图返回,并选择另一组行。

标签: c# wpf mvvm gridview telerik-grid


【解决方案1】:

但是我需要在某处取消绑定事件吗?

这取决于相关对象的生命周期。如果您不希望 MyRowModel 对象在您离开视图模型时阻止它被垃圾回收,您应该在视图为 Unloaded 时取消注册事件处理程序,并在视图为 Loaded 时注册它们:

 MyRows.ForEach(p=> p.PropertyChanged -= MyPropertyChangedHandler);

如果项目被动态添加到MyRows 或从MyRows 中删除,您还应该检测何时发生这种情况并相应地注册和取消注册事件处理程序。如果MyRowsObservableCollection<T>,您可以handle CollectionChanged 事件。

如果您考虑使用弱事件,您还应该考虑使用WeakEventManager+= 运算符之间的semantic differences 来连接事件处理程序。

【讨论】:

  • 当用户退出该视图时,我现在“手动”取消注册事件
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 2022-01-13
相关资源
最近更新 更多