在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时,我做错了什么?

在XAML页面级别定义的UserControl 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。因此,在大多数情况下,不必在控件中显式设置它,而您仍然可以在代码隐藏中访问它(因为它是由页面隐式设置的)。