WPF绑定 - 通知更改ToString值

时间:2010-02-19 12:18:04

标签: wpf data-binding

我有一个绑定到对象的文本块。这个对象我重写了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);
  }
}

5 个答案:

答案 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")