2014-07-08 24 views
0

我想了解我们是否可以从ZViewModel更新XView数据环境?如何从完全不同的视图模型更新视图的datacontext

我有一个XView并加载它绑定到它的DataContext绑定到它的XViewModel。

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

我可以这样做吗?请有任何想法吗?

回答

0

回答你的问题:并不是我所知道的。

此外,它有点违背MVVM的原则,让ViewModel“仰视”视图。

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

,你可以在效果:

  1. 有XViewModel T类型
  2. 有无ZViewModel的信息登记通过类型T的消息在EventBus
  3. XViewModel当它接收ZViewModels将执行一些处理程序消息

美的是,两个VM都不知道另一个。它通过总线完全解耦。

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}}" /> 
相关问题