我有一个绑定到对象的文本块。这个对象我重写了ToString以返回其他2个属性的组合。如何在更新其中一个属性值时通知ToString值已更改?
不幸的是我无法更改ToString值的绑定,因为这是在第三方控件中,所以真的需要能够直接通知。
希望下面的课程定义能说明我的意思:
public class Person : INotifyPropertyChanged
{
private string firstname;
public string Firstname
{
get { return firstname; }
set
{
firstname = value;
OnPropertyChanged("Firstname");
}
}
private string surname;
public string Surname
{
get { return surname; }
set
{
surname = value;
OnPropertyChanged("Surname");
}
}
public override string ToString()
{
return string.Format("{0}, {1}", surname, firstname);
}
}
答案 0 :(得分:3)
如果您不想为全名添加专用属性,则应该能够在绑定中使用StringFormat。请参阅此blog post中的MultiBinding示例。 [需要.NET 3.5 SP1]
答案 1 :(得分:3)
我假设当你说控件是“绑定”到ToString()时,你的对象被用作ContentControl上的内容,在无法访问的代码中,默认情况下会创建一个显示ToString值的TextBlock(如果你不是确定你可以找到Snoop)。如果在控件的资源中为Person类型创建全局类型的DataTemplate,则可以使用它来显示不同的属性,如新的FullName属性:
<ThirdPartyControl.Resources>
<DataTemplate DataType="{x:Type data:Person}">
<TextBlock Text="{Binding FullName}"/>
</DataTemplate>
</ThirdPartyControl.Resources>
答案 2 :(得分:2)
您可以添加第三个只读属性,该属性返回ToString()
,并使用该属性的名称调用OnPropertyChanged
答案 3 :(得分:0)
当一个或多个属性更改时,可以使用多重绑定(不使用转换器)来调用ToString()方法。
<StackPanel>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}">
<Binding Path="" />
<Binding Path="Firstname" />
<Binding Path="Surname" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
答案 4 :(得分:-1)
不要绑定到ToString()
。而是在您的其他属性设置器中引入FullName
属性并引发OnPropertyChanged("FullName")
。