在XAML页面级别定义的UserControl DataContext
本文关键字:定义 UserControl DataContext XAML | 更新日期: 2023-09-27 18:27:32
我在XAML页面级别为UserControl定义了一个DataContext,如下所示(最后一行是相关的):
<UserControl
x:Class="Sample.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:data="using:Sample.Models"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="768"
d:DesignWidth="1024"
DataContext="data:TestDataCollection">
目的是能够访问托管UserControl的页面中的DataContext对象,如下所示,myUserControl是UserControl的x:Name
。
TestDataCollection tdc = myUserControl.DataContext as TestDataCollection;
在UWP平台上,数据绑定、UI显示和更新一切正常。
唯一的一个问题是上面的代码行没有返回预期的DataContext对象。事实上,myUserControl.DataContext在调试期间显示的是一个值为"data:TestDataCollection"的字符串(与上面的XAML代码相同),而不是TestDataCollection
类型的对象。
这里还有一件奇怪的事情:如果我将codebehind中的DataContext设置为:
this.DataContext = new TestDataCollection();
问题已经解决,即(myUserControl.DataContext作为TestDataCollection)按预期返回DataContext对象。
在XAML中设置页面DataContext时,我做错了什么?
通过使用DataContext="data:TestDataCollection"
,您只需要设置字符串值。如果要设置视图模型对象,则必须使用以下语法:
<UserControl
x:Class="Sample.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:data="using:Sample.Models"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="768"
d:DesignWidth="1024">
<UserControl.DataContext>
<data:TestDataCollection />
</UserControl.DataContext>
</UserControl>
请注意,您的用户控件还将从其使用的页面继承DataContext
。因此,在大多数情况下,不必在控件中显式设置它,而您仍然可以在代码隐藏中访问它(因为它是由页面隐式设置的)。