我有一个基本 DataClass,其中包含字符串形式的日期信息。
public class DataClass
{
string DateInfo;
}
我有一个 UserControl,其中包含该类的实例和一个 TextBlock。
public partial class MyControl : UserControl
{
public DateInfo MyData = new DateInfo();
}
在 XAML 中,我尝试将 MyControl 的 TextBlock 绑定到控件自己的 DataClass 内部实例,但在建立路径时遇到困难。我尝试了RelativeSource Self,但这仅指 TextBlock 本身。所以我尝试了这个
<TextBlock x:Name="DateCreated"
Text="{Binding Path=MyData.Created,
Converter={StaticResource dateConverter},
RelativeSource={RelativeSource AncestorType=UserControl}}" />
但是我收到错误“BindingExpression 路径错误:在对象上找不到‘MyData’属性。”编译器不允许我将 AncestorType 设置为 MyControl;它坚持要求我使用通用类型名称。
我错过了什么?我看到的第一个错误是
DataClass
。它根本没有意义,因为它只有一个 private
字段 DateInfo
。不使用反射就无法访问它。顺便说一句,如果 DataInfo
确实与日历日期有关,那么使用字符串来表示此数据是一个错误的想法。出于绑定或其他表示目的,您可以拥有基于数据的只读字符串属性,但使用数据的字符串表示形式而不是数据本身是错误的想法。
其他事情可能与您的代码本身无关,而仅与您的问题有关。您说
DataClass
是基类,但您没有显示任何派生类。您甚至没有在下面显示任何 DataClass
的使用,只提到您的控件“拥有”它。
好吧,让我们先把问题的表述放在一边,回到问题本身。无需深入了解,重要的是要了解绑定基于“依赖属性”。此外,Microsoft 文档 解释了依赖属性应该为 public
。这不是一个根本性的限制,而是基于这样一个事实:非公共成员不打算用于某些机制,包括绑定。
MyData
,如异常消息中所示,这仅仅是因为您没有具有此名称的依赖属性。或者也许你有类似其他地方的东西,但不显示它,你只显示一个公共字段
MyControl.MaData
。在所有情况下,异常消息都非常清楚:未找到 MyData
属性。顺便说一句,大多数应用程序中的公共字段都被认为是不好的做法。现在,解决您的问题:
将 Text
的
TextBlock
与控件的某些依赖属性绑定是没有问题的。例如,最简单的方法之一可能是通过 ElementName
进行 bunding — 请参阅本文档页面上的两行 XAML 示例。您可以使用控件的依赖属性名称来代替
Value
,并且您需要在 XAML 中为此控件实例指定一个名称。