簡體   English   中英

DataContext綁定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM