【发布时间】:2017-01-19 10:08:47
【问题描述】:
我会尽可能详细地解释我的问题。我的应用程序是使用 mvvm 组成的,并且有一个加载一些静态视图的 shellview。继承人来了问题1: 在 shellviewmodel 中实例化这些视图模型是一种好习惯吗?
public ShellViewModel(IScreen screen)
{
HostScreen = screen;
LogoViewModel = new LogoViewModel(HostScreen);
...
StatusViewModel = new StatusViewModel();
}
无论如何我也有一个静态视图,它有一个列表,它的 ItemSource 属性绑定到一个 ReactiveList
public ShiftOrderView()//ShiftOrderViewModel viewModel)
{
InitializeComponent();
this.WhenActivated(
d =>
{
this.OneWayBind(ViewModel, vm => vm.ProductionOrderList, v => v.ShiftOrder.ItemsSource).AddTo(d);
});
}
现在每当用户选择一个新的列表项时,该项就会显示在另一个视图中。我目前正在通过导航进行此操作
this.WhenActivated(d =>
{
this.WhenAnyObservable(o => o.ProductionOrderList.ItemChanged)
.Where(x => x.PropertyName == "ItemsLeft")
.Select(x => x.Sender)
.Where(x => x.ItemsLeft == 0)
.Subscribe(x =>
{
ProductionOrderList.Remove(x);
}).AddTo(d);
this.WhenAnyValue(vm => vm.SelectedProductionOrderViewModel).Where(pvm => pvm != null)
.Subscribe(pvm =>
{
HostScreen.Router.NavigateAndReset.Execute(
new ProductionOrderDetailViewModel(HostScreen,
Locator.CurrentMutable.GetService<IProductionItemService>(), pvm));
}).AddTo(d);
});
但我认为这不是正确的方法并且会引入内存泄漏。正如您在上面的代码中看到的,当 itemsleft 属性达到 0 时,项目会从列表中删除。但我不确定如何正确处理这些项目。如果我在导航方法中创建一个新实例,旧的新 ProductionOrderDetailViewModel 会被处理掉吗?如果没有,我怎么能做到这一点? 我确定我错过了正确答案所需的一些部分,所以请询问,我会提供您需要的信息。
在此先感谢您的问候
【问题讨论】:
-
我感觉你在这里用错了词。
Items get removed from the list when their itemsleft property reaches 0。你是说Senders get removed from the list when their itemsleft property reaches 0
标签: c# mvvm memory-leaks dispose reactiveui