WPF绑定 - 通知更改到ToString值

10

我有一个文本块(textblock),它绑定(bind)到一个对象(object)。我已经重写了这个对象的ToString方法,返回了2个其他属性(properties)的组合(combination)。当其中一个属性值(property values)被更新时,如何通知(notify) ToString 值已经更改?

不幸的是,由于这在第三方控件(3rd party control)中,我无法更改对 ToString 值的绑定(binding),因此真正需要做到直接通知(notify)。

希望下面的类定义能澄清我的意思:

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);
  }
}
5个回答

3

我假设当你说控件“绑定”到ToString()时,你的对象被用作某个地方ContentControl中的内容,该控件默认创建一个TextBlock来显示ToString值(如果不确定,可以使用Snoop查找)。如果您在控件的资源中为Person类型创建全局类型DataTemplate,您可以使用它来显示不同的属性,例如新的FullName属性:

<ThirdPartyControl.Resources>
  <DataTemplate DataType="{x:Type data:Person}">
    <TextBlock Text="{Binding FullName}"/>
  </DataTemplate>
</ThirdPartyControl.Resources>

3

如果您不想为全名添加专用属性,您可以在绑定中使用StringFormat。请参见此博客文章中的MultiBinding示例。[需要.NET 3.5 SP1]


2
您可以添加第三个只读属性,该属性返回ToString(),并使用该属性的名称调用OnPropertyChanged

0

你可以使用多绑定(无需转换器)在一个或多个属性更改时调用ToString()方法。

<StackPanel>
  <TextBlock>
    <TextBlock.Text>
      <MultiBinding StringFormat="{}{0}">
        <Binding Path="" />
        <Binding Path="Firstname" />
        <Binding Path="Surname" />
      </MultiBinding>
    </TextBlock.Text>
  </TextBlock>
</StackPanel>

-1
不要绑定到 ToString()。相反,引入一个 FullName 属性,并在其他属性的 setter 中都触发 OnPropertyChanged("FullName")

3
这个说法很有道理,但是(我在原帖中没有提到这一细节,现在我要编辑一下),ToString值的绑定在一个第三方控件中,我无法更改。 - David Ward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接