【发布时间】:2017-12-06 12:26:05
【问题描述】:
我有 2 个视图和 2 个视图模型:
第一个视图:
public partial class FirstView : Page
{
FirstViewModel ViewModel;
public FirstView()
{
ViewModel = new FirstViewModel();
ViewModel.ShowSecondView.Subscribe(_ =>
{
NavigationService.Navigate(new SecondView(ViewModel.ChildViewModel));
});
this.DataContext = ViewModel;
InitializeComponent();
}
}
第一个 ViewModel:
public class FirstViewModel
{
SecondViewModel ChildViewModel;
public ReactiveCommand<Unit, Unit> ShowSecondView { get; set; }
public FirstViewModel()
{
ChildViewModel = new SecondViewModel();
ShowSecondView = ReactiveCommand.Create(() =>
{
ChildViewModel.Reconfigure(...);
});
}
}
第二个视图:
public partial class SecondView : Page
{
SecondViewModel ViewModel;
public SecondView(SecondViewModel viewModel)
{
ViewModel = viewModel;
ViewModel.GoBack.Subscribe(_ =>
{
DoSomethingHard();
if(NavigationService != null) NavigationService.GoBack();
});
this.DataContext = ViewModel;
InitializeComponent();
}
}
第二个视图模型:
public class SecondViewModel
{
public ReactiveCommand<Unit, Unit> GoBack { get; set; }
public FirstViewModel()
{
VeryLongInitialization();
GoBack = ReactiveCommand.Create(() => { });
}
public void Reconfigure(...)
{ ... }
}
所以,当我多次运行FirstViewModel.ShowSecondView 并多次运行SecondViewModel.GoBack 时,DoSomethingHard() 也会在每个创建的 SecondView 上执行多次。
为什么我要在FilstViewModel 中创建一次ChildViewModel?因为SecondViewModel 的创建需要很长时间。而且我不会每次都重新创建SecondViewModel,而只是重新配置它。
我的问题是如何在SecondView 中取消订阅ViewModel.GoBack.Subscribe?
附:也许我不应该在FirstView 中重新创建SecondView,而是重新配置它以及SecondViewModel?
更新 1(感谢 Julien Mialon)
我添加IDisposable goBackSubscr 并且它有效!我执行它是否正确?
public partial class SecondView : Page
{
SecondViewModel ViewModel;
IDisposable goBackSubscr;
public SecondView(SecondViewModel viewModel)
{
ViewModel = viewModel;
goBackSubscr = ViewModel.GoBack.Subscribe(_ =>
{
DoSomethingHard();
if(NavigationService != null) NavigationService.GoBack();
goBackSubscr.Dispose();
});
this.DataContext = ViewModel;
InitializeComponent();
}
}
【问题讨论】:
标签: c# .net wpf mvvm reactiveui