说我有这样的课程:
public class MyClass
{
public string Name;
public int Id;
public override string ToString()
{
return this.Id.ToString() + " - " + this.Name;
}
}
如果我将datagrid文本列绑定到此类的对象实例(不使用转换器),则会调用重写的ToString并成功显示Id - Name。但是,当我将同一个对象绑定到TextBlock的Text属性时,永远不会调用ToString并且Text为空。我知道我可以使用转换器,但我试图理解为什么绑定不像我绑定到datagrid列时那样调用ToString。
Datagrid列绑定(datagrid的项源是MyClass对象的集合):
<DataGridTextColumn Binding="{Binding .}" Header="Id - Name"/>
TextBlock绑定:
<TextBlock><Run Text="{Binding myClass, ElementName=UserControl}"/></TextBlock>
注意:如果我将myClass更改为myClass.Name,则会成功显示Name属性。
答案 0 :(得分:2)
如果绑定类型不匹配,WPF将对绑定应用隐式转换器进行某些转换。转换为字符串可以通过调用ToString()来完成,就像它在.Net框架的其他区域中隐式调用一样。
默认情况下,TextBox的Text绑定是双向的,因此无法使用隐式转换器,因为字符串无法转换回MyClass类型。网格列中显示模板的绑定是一种方式,因此可以使用隐式转换器。我想如果你通过点击它将网格列置于编辑模式,你会得到一个绑定错误。