【问题标题】:Binding string property to object将字符串属性绑定到对象
【发布时间】: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 属性绑定..."
  • 从中推断,只是猜测,TextBoxdefault 绑定有两种方式。为了证明这一点,您可以尝试为TextBox 指定一种方式绑定(只读)并查看它是否有效。如果是,那是实际的解释:)
  • @Tigran:你们中的一个人应该发布一个答案(这样才能被接受)......

标签: c# wpf


【解决方案1】:

如果绑定类型不匹配,WPF 将对某些转换应用隐式转换器。转换为字符串可以通过调用 ToString() 来完成,就像在 .Net 框架的其他区域中隐式调用它一样。

默认情况下,TextBox 的文本绑定是双向的,因此不能使用隐式转换器,因为字符串不能转换回您的 MyClass 类型。网格列中显示模板的绑定是一种方式,因此可以使用隐式转换器。我想如果您通过单击将网格列置于编辑模式,您会收到绑定错误。

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多