2014-07-08 70 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}}" /> 
相關問題