如何从完全不同的视图模型更新视图的datacontext

时间:2014-07-08 19:14:17

标签: wpf mvvm

我想了解我们是否可以从ZViewModel更新XView datacontext?

我有一个XView,在加载时它绑定到它的DataContext绑定到它的XViewModel。

在ZViewModel中,我创建了一个新的XViewModel实例,并希望使用这个新的XViewModel更新XView的datacontext。

我可以这样做吗?有什么想法吗?

2 个答案:

答案 0 :(得分:0)

回答你的问题:据我所知。

此外,它有点违背MVVM的原则,使ViewModel"查找"进入一个视图。

如果你试图从根本上改变XViewModel中的一些数据集,你可能会查看MVVM Light中的Event Bus。它可以让一个VM订阅某种类型的消息,并在收到该消息时执行某些操作。

你可以,实际上:

  1. 让XViewModel注册T
  2. 类型的消息
  3. 让ZViewModel在EventBus上传递类型为T的消息
  4. XViewModel在收到ZViewModels消息时会执行一些处理程序
  5. 美丽的是,VM都不知道对方。它通过总线完全解耦。

答案 1 :(得分:0)

如果您的视图是UserControl,这非常简单。您可以将DataContext的绑定设置为ViewModel中的属性。单击该按钮实际上会将UserControl重置为其默认状态。

<Window
    //usual Window declarations>

   <Grid x:Name="LayoutRoot">
      <view:MyView DataContext="{Binding MyViewModelProperty}" />
      <Button Command="{Binding CmdChangeViewModel}"
              Content="Change VM" />
   </Grid>
</Window>

MainViewModel:

private IViewModelBase _MyViewModelProperty;
public IViewModelBase MyViewModelProperty
{
   get { return _MyViewModelProperty; }
   set { Set("MyViewModelProperty", ref _MyViewModelProperty, value); }
}

public ICommand CmdChangeViewModel
{
    get
    {
       return new RelayCommand(() =>
       {
          MyViewModelProperty = new MyViewModel();
       });
    }
}

如果您的观点是另一个窗口,那么您将需要使用ViewModelLocator。我使用MVVM Light中的那个。使用上面的相同MainViewModel,单击主视图中的按钮将更改另一个窗口的DataContext。

子窗口:

<Window
   //usual Window declarations
   DataContext="{Binding Main.MyViewModelProperty, Source={StaticResource Locator}}" />