首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataContext结合

DataContext结合
EN

Stack Overflow用户
提问于 2016-02-12 16:42:58
回答 2查看 229关注 0票数 1

我有三种不同的观点。我对每个视图都有视图模型。我所做的是将视图的数据文本设置为各自视图模型的一个新实例,其工作方式如下所示:

代码语言:javascript
复制
public LoginScreen()
        {
            InitializeComponent();
            DataContext = new LoginScreenViewModel();
        }

这是按需要工作的。一切都是正确的。

现在,我的每个视图都设置为UserControls。我的窗口为我的每个视图提供了数据板,如下所示:

代码语言:javascript
复制
<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>

我展示的视图如下:

代码语言:javascript
复制
 <Grid>
        <ContentControl Content="{Binding CurrentView}"/>
 </Grid>

这允许我在窗口的视图模型中创建视图模型,将其设置为CurrentView,并在窗口中显示与该视图模型关联的视图。这一切都是正确的。

我的问题是,如果我切换视图,存储在视图的ViewModel中的所有信息都会被销毁。我的问题是,如何将每个视图的数据文本绑定到正在创建它的视图模型,而不是绑定到后面代码中的一个新实例?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-12 18:17:12

我想你在这里有点困惑。您不需要显式地为您的DataContext(s)创建views。当您的ViewModel定义您的视图时,它也作为DataContext传递给您的View

不要显式地分配一个DataContext,并在视图加载后尝试检查它的DataContext。实际上是ViewModel导致了view的加载。

例如,,如果您的视图是LoginScreen,则您的DataContext将是vm:LoginScreenViewModel。在加载vm:LoginScreenViewModel并将其分配给视图之后,不需要创建LoginScreen的新对象。

票数 1
EN

Stack Overflow用户

发布于 2016-02-12 16:51:24

从视图模型实例化视图可能会更好。在CurrentView内容控件所在的地方实例化视图模型,只需将Content属性设置为视图模型中包含的视图。这样,每次切换视图时都不会重新创建它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35367868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档