我想了解我們是否可以從ZViewModel更新XView數據環境?如何從完全不同的視圖模型更新視圖的datacontext
我有一個XView並加載它綁定到它的DataContext綁定到它的XViewModel。
在ZViewModel中,我創建了一個XViewModel的新實例,並希望用這個新的XViewModel更新XView的datacontext。
我可以這樣做嗎?請有任何想法嗎?
我想了解我們是否可以從ZViewModel更新XView數據環境?如何從完全不同的視圖模型更新視圖的datacontext
我有一個XView並加載它綁定到它的DataContext綁定到它的XViewModel。
在ZViewModel中,我創建了一個XViewModel的新實例,並希望用這個新的XViewModel更新XView的datacontext。
我可以這樣做嗎?請有任何想法嗎?
回答你的問題:並不是我所知道的。
此外,它有點違背MVVM的原則,讓ViewModel「仰視」視圖。
如果您試圖從根本上更改XViewModel中的某些數據集,則可以查看MVVM Light中的Event Bus。它可以讓一個虛擬機訂閱某種類型的消息,並在收到該消息時執行一些操作。
,你可以在效果:
美的是,兩個VM都不知道另一個。它通過總線完全解耦。
如果你的視圖是一個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}}" />