【发布时间】:2014-05-11 17:03:01
【问题描述】:
我有一个关于窗口的数据上下文以及子控件如何继承它的问题。
如果我有一个窗口,其DataContext 属性在 XAML 中设置如下:
<Window.DataContext>
<local:SomeViewModel />
</Window.DataContext>
通过向窗口添加用户控件,我了解用户控件的数据上下文将从窗口继承(除非我另有说明)。
<local:MyUserControl />
在用户控件中呢?由于它是一个不同的 XAML 文件,我如何在用户控件中强烈键入数据上下文?因此,如果我在控件中指定数据上下文:
<UserControl.DataContext>
<local:SomeViewModel />
</UserControl.DataContext>
这是否会覆盖 Window 的视图模型实例,在内存中创建一个新实例?我认为确实如此,如果是这样,我如何通过 xaml 将视图模型传递给子视图?我知道我可以通过直接分配在代码隐藏中做到这一点,但我希望这可以在 xaml 中处理。
我们已经隔离了大部分 UI,目前必须在后面的代码中手动分配上下文。
我尝试使用RelativeSource,但它似乎不起作用。也许我用错了,但上下文从未传递过。
有什么想法吗?
更新 1
为了澄清,我展示了一个简单的窗口,其中 DataContext 设置为自定义视图模型。
<Window x:Class="MyProject.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels="clr-namespace:MyProject.ViewModels"
xmlns:views="clr-namespace:MyProject.MyCustomView">
<Window.DataContext>
<viewModels:ProjectViewModel />
</Window.DataContext>
<StackPanel>
<views:MyCustomView />
</StackPanel>
<Window>
现在在我的MyCustomView 用户控件中,其他开发它的开发人员不会知道数据上下文的类型是什么,而无需手动遍历所有可能的父窗口以查看它被使用的位置。我想要的是在我的 UserControl 中执行以下操作:
<UserControl x:Class="MyProject.Views.DiaryDetailsDescription"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" >
<UserControl.DataContext Type="viewModels:ProjectViewModel />
</UserControl>
因此,处理该用户控件的设计人员/开发人员知道该用户控件的数据上下文将是 ProjectViewModel 类型,由拥有的 Window 继承。
更新 2
所以为了进一步澄清,我想要在我的用户控件 XAML 中执行的操作等同于以下 C# 代码。
return (SingleViewModel)this.DataContext;
因此,Blend 中的设计器确切地知道 DataContext 将是什么类型。对他来说,DataContext 只是用户控件中的一个对象,尽管它从 Window 继承了SingleViewModel 上下文。
【问题讨论】:
-
how can I pass around a ViewModel to children views via xaml?- 你能详细写一下吗? -
如果默认继承,那还需要手动传递什么呢?
-
问题是用户控件不知道数据上下文的类型。它使智能感觉毫无价值且难以编码。如果我可以在用户控件 xaml 中强烈键入上下文,使用父类型会很好。
-
另一个原因是设计师和其他开发人员需要这个。如果我将控件添加到主窗口,那么我知道上下文将是什么。如果另一个开发人员发现布局问题并打开控件 xaml 来修复它,则不会有任何强类型来让他/她知道上下文是什么类型。
-
我应@Anatoliy 的要求添加了额外的说明。
标签: wpf xaml mvvm datacontext