从ICommand回到MainView

时间:2016-02-28 21:25:24

标签: c# wpf xaml mvvm

我可能在这里忽略了这一点,我现在已经挖掘了一段时间,看了the different approaches来绑定视图和查看模型以及如何在它们之间导航。

设定:

  • 1 MainWindow(ViewModel:MainWindowViewModel
  • MainWindow包含一些视觉效果以及绑定到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为空。由于请求来自该对象,我可以想象它不是很好。

1 个答案:

答案 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