如何使用 XAML 将 TextBlock 绑定到内部字段?

问题描述 投票:0回答:1

我有一个基本 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;它坚持要求我使用通用类型名称。

我错过了什么?

c# xaml binding
1个回答
0
投票

我看到的第一个错误是

DataClass
。它根本没有意义,因为它只有一个
private
字段
DateInfo
。不使用反射就无法访问它。顺便说一句,如果
DataInfo
确实与日历日期有关,那么使用字符串来表示此数据是一个错误的想法。出于绑定或其他表示目的,您可以拥有基于数据的只读字符串属性,但使用数据的字符串表示形式而不是数据本身是错误的想法。

其他事情可能与您的代码本身无关,而仅与您的问题有关。您说

DataClass
是基类,但您没有显示任何派生类。您甚至没有在下面显示任何
DataClass
的使用,只提到您的控件“拥有”它。

好吧,让我们先把问题的表述放在一边,回到问题本身。无需深入了解,重要的是要了解绑定基于“依赖属性”。此外,Microsoft 文档 解释了依赖属性应该为 public。这不是一个根本性的限制,而是基于这样一个事实:非公共成员不打算用于某些机制,包括绑定。

您没有将任何内容绑定到 XAML 中的 

MyData

,如异常消息中所示,这仅仅是因为您没有具有此名称的依赖属性。或者也许你有类似其他地方的东西,但不显示它,你只显示一个公共字段

MyControl.MaData
。在所有情况下,异常消息都非常清楚:未找到
MyData
属性。顺便说一句,大多数应用程序中的公共字段都被认为是不好的做法。
现在,解决您的问题:

Text

TextBlock
与控件的某些依赖属性绑定是没有问题的。例如,最简单的方法之一可能是通过
ElementName
进行
bunding — 请参阅本文档页面上的两行 XAML 示例。您可以使用控件的依赖属性名称来代替 
Value
,并且您需要在 XAML 中为此控件实例指定一个名称。
    

© www.soinside.com 2019 - 2024. All rights reserved.