我可能在这里忽略了这一点,我现在已经挖掘了一段时间,看了the different approaches来绑定视图和查看模型以及如何在它们之间导航。
设定:
MainWindowViewModel
)ContentControl
的{{1}}。所以在ViewModelBase
我可以设置任何其他视图(模型)来显示。内部App.xaml
MainWindowViewModel
目标:
从<DataTemplate DataType="{x:Type vms:LoginViewModel}">
<Views:LoginView />
</DataTemplate>
<DataTemplate DataType="{x:Type vms:LoadingViewModel}">
<Views:LoadingView />
</DataTemplate>
内的ICommand返回到LoginViewModel
,表格数据很长。然后,MainWindowViewModel
将切换到MainWindowViewModel
,对服务执行异步调用。下次启动刷新令牌时,我将显示LoadingViewModel
而不是登录表单。完成后,将打开一个新窗口(或其他内容,尚不知道)。
问题:大多数示例显示当按钮位于两个用户控件之外时如何执行此操作,因此当ICommand位于MainWindow内部时,它会很容易,但事件是从其中一个子视图。使用PropertyChange似乎也有点过时了。
让我们深入研究一些代码吧,我们呢?
MainWindow.xaml,只有一个重要的行
LoadingViewModel
MainWindow.xaml.cs,在构造函数
中<ContentControl Content="{Binding CurrentView}" Grid.Column="1" Grid.Row="1" />
MainWindowViewModel
this.DataContext = new MainWindowViewModel();
LoginViewModel
public class MainWindowViewModel
{
public ViewModelBase CurrentView { get; set; }
public MainWindowViewModel()
{
CurrentView = new LoginViewModel();
}
}
public class LoginViewModel : ViewModelBase
{
public DelegateCommand loginCommand { get; set; }
public LoginViewModel()
{
loginCommand = new DelegateCommand(Execute, CanExecute);
}
private bool CanExecute()
{
return true;
}
private void Execute()
{
//I need to go to MainWindowViewModel
throw new NotImplementedException();
}
//more properties below heere.
继承自ViewModelBase
(来自Prism),因此处理PropertyChanged事件。我的视图模型中的属性使用正确的BindableBase
方法。 我不想使用Prism的区域,IEventAggregator或Unitiy。
解决方案
我想到的是使用构造函数发送一个很长的接口,并使用接口对SetProperty
进行“回调”,但我想这会产生错误,因为我会更改视图,从而将MainWindowViewModel
设置为其他内容,使MainWindowViewModel.CurrentView
为空。由于请求来自该对象,我可以想象它不是很好。
答案 0 :(得分:1)
沟通的好方法是Messanger(MVVM Light)或EventAggregator(Prism)概念。
它基本上是一个内存的pub / sub系统。
以下是MSDN上一篇文章的示例
MVVM - Messenger and View Services in MVVM
Using the event aggregator pattern to communicate between view models
我不确定您使用的是哪个框架/库,但大多数MVVM框架都有类似的概念用于糟糕的耦合通信。
这是处理通信的一个非常强大的概念。但是,有很大的力量来责任=)......
HTH