在一个简单的形式中,我绑定到许多不同的对象——有些放在列表框中;有些放在列表框中;有些放在列表框中。一些在文本块中。
其中一些对象具有协作对象,在这些对象上ToString()
方法在执行其工作时调用——通常是某种格式化程序。
当我单步执行代码时,我发现当设置数据绑定时,
-
ToString()
叫做
- 协作对象不是
null
并返回预期结果
- 当在调试器中检查时,对象返回预期结果
ToString()
BUT文字确实not显示在表格中。
我看到的唯一共同点是它们使用协作对象,而按预期显示的其他绑定只是通过包含对象的属性和方法工作。
如果这令人困惑,这里是代码要点:
public class ThisThingWorks
{
private SomeObject some_object;
public ThisThingWorks(SomeObject s) { some_object = s; }
public override string ToString() { return some_object.name; }
}
public class ThisDoesntWork
{
private Formatter formatter;
private SomeObject some_object;
public ThisDoesntWork(SomeObject o, Formatter f)
{
formatter = f;
some_object = o;
}
public override string ToString()
{
return formatter.Format(some_object.name);
}
}
让我再次重申——ToString()
method works在所有其他上下文中 - 但是当我绑定到 WPF 中的对象并期望它显示以下结果时ToString()
,我什么也没得到。
Update:
这个问题似乎是我认为的错误行为TextBlock
捆绑。如果我绑定Text
财产到财产DataContext
被声明为接口类型,ToString()
从未被调用过。如果我将属性声明更改为接口的实现,它将按预期工作。其他控件,例如Label
绑定时工作正常Content
财产给一个DataContext
属性声明为实现或接口。
因为到目前为止,这已经从这个问题的标题和内容中删除了,所以我在这里创建了一个新问题:当绑定属性声明为接口与类类型时,WPF 绑定行为不同吗? https://stackoverflow.com/questions/2917878/why-doesnt-textblock-databinding-call-tostring-on-a-property-whose-compile-tim
更改了标题:当绑定属性声明为接口与类类型时,WPF 绑定行为不同吗? https://stackoverflow.com/questions/2917878/wpf-binding-behaviour-different-when-bound-property-is-declared-as-interface-vs-c