[英]DataContext binding
我有三種不同的看法。 我有每個視圖的視圖模型。 我要做的是將視圖的數據上下文設置為相應視圖模型的新實例,其工作方式如下所示:
public LoginScreen()
{
InitializeComponent();
DataContext = new LoginScreenViewModel();
}
這可以按需工作。 一切都正確地綁定等等。
現在,我將每個視圖都設置為UserControls。 我的Window的每個視圖都有數據模板,如下所示:
<Window.Resources>
<DataTemplate DataType="{x:Type vm:LoginScreenViewModel}">
<v:LoginScreen/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:MainWindowViewModel}">
<v:MainWindow/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:AboutScreenViewModel}">
<v:AboutScreenView/>
</DataTemplate>
</Window.Resources>
我這樣顯示視圖:
<Grid>
<ContentControl Content="{Binding CurrentView}"/>
</Grid>
這使我可以在窗口的視圖模型中創建視圖模型,並將其設置為CurrentView,並且與該視圖模型關聯的視圖顯示在窗口中。 這一切都正常工作。
我的問題是,如果我切換視圖,則存儲在視圖的ViewModel中的所有信息都會被破壞。 我的問題是,如何將每個視圖的數據上下文綁定到正在創建它的視圖模型,而不是綁定到后面的代碼中的新實例?
我覺得您在這里有些困惑。 您無需為views
明確創建DataContext(s)
。 當您的ViewModel
定義您的View時,它也作為DataContext
傳遞給您的View
。
不要顯式分配
DataContext
並嘗試在加載視圖后檢查其DataContext
。 實際上是導致view
加載的ViewModel
。
例如,如果您的視圖是LoginScreen
您的DataContext將是vm:LoginScreenViewModel
。 加載LoginScreen並將其分配給視圖后,無需創建vm:LoginScreenViewModel
的新對象。
從視圖模型實例化視圖可能會更好。 無論CurrentView內容控件在哪里,都可以實例化視圖模型,只需將Content屬性設置為視圖模型中包含的視圖即可。 這樣,您每次切換視圖時都不會重新創建它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.