【发布时间】:2012-01-29 00:54:11
【问题描述】:
假设我有这样的课程:
public class MyClass
{
public string Name;
public int Id;
public override string ToString()
{
return this.Id.ToString() + " - " + this.Name;
}
}
如果我将数据网格文本列绑定到此类的对象实例(不使用转换器),则会调用重写的 ToString 并成功显示 Id - Name。但是,当我将同一个对象绑定到 TextBlock 的 Text 属性时,永远不会调用 ToString 并且 Text 为空。我知道我可以使用转换器,但我试图理解为什么绑定不像绑定到数据网格列时那样调用 ToString。
Datagrid 列绑定(datagrid 的项源是 MyClass 对象的集合):
<DataGridTextColumn Binding="{Binding .}" Header="Id - Name"/>
TextBlock 绑定:
<TextBlock><Run Text="{Binding myClass, ElementName=UserControl}"/></TextBlock>
注意:如果我将 myClass 更改为 myClass.Name,那么它会成功显示 Name 属性。
【问题讨论】:
-
我刚刚尝试将 Mode=OneWay 添加到 TextBlock 的绑定表达式({Binding myClass, ElementName=UserControl, Mode=OneWay}),它成功了!现在我更想知道幕后发生了什么。
-
您是否查看了 VS
output以查看失败的绑定(如果是TextBox)报告? -
谢谢。没有意识到 VS 输出绑定失败的错误,认为它们是引擎盖下的无声错误。当我查看输出时,我确实看到:“System.Windows.Data 错误:1:无法创建默认转换器来执行类型“Example.MyClass”和“System.String”之间的“双向”转换。考虑使用 Converter 属性绑定..."
-
从中推断,只是猜测,
TextBox像 default 绑定有两种方式。为了证明这一点,您可以尝试为TextBox指定一种方式绑定(只读)并查看它是否有效。如果是,那是实际的解释:) -
@Tigran:你们中的一个人应该发布一个答案(这样才能被接受)......