我有长寿命的模型和使用视图显示的属性。
我视图中的DataContext是一个使用寿命短的ViewModel。
示例包括列表中的行视图模型。
为了避免内存泄漏,ViewModels使用
System.Windows.WeakEventManager
.
如果我正常订阅,长寿模型将保持viewModel的活动状态。
在每个视图模型中使用weakEventManager似乎非常麻烦。
这个用例看起来像是WPF的标准用例。我是否遗漏了WPF或C的基本概念,这将有助于我在这里编写更好的代码?
下面是一个最小的例子,说明了我现在所做的。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ShortLivedViewModel(new LongLivingModel());
}
}
public class ShortLivedViewModel : INotifyPropertyChanged
{
private string _myText;
public ShortLivedViewModel(LongLivingModel model)
{
model.SomeEvent += SomeEventHandler;
WeakEventManager<LongLivingModel, EventArgs>.AddHandler(model, nameof(LongLivingModel.SomeEvent),
SomeEventHandler);
}
public string MyText
{
get => _myText;
set
{
_myText = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(MyText)));
}
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private void SomeEventHandler(object sender, EventArgs e)
{
MyText = Guid.NewGuid().ToString("N");
}
}
public class LongLivingModel
{
public EventHandler<EventArgs> SomeEvent = delegate { };
}
我的问题是,是否有一种简单的方法可以从一个短的生命体订阅一个长的生命体。或者如果在WPF中有一些设施我不知道。
我突然想到这是标准情况。
我玩的是添加
IDisposable
接口,但这只留下了我跟踪什么时候调用Dispose,以便我可以取消订阅。
我要寻找的可能是告诉GC订阅不计入ViewModel的生存期,以及取消订阅销毁,或者是更好的解决方案。