Связывание WPF - уведомление о изменении на значение ToString

У меня есть текстовый блок, привязанный к объекту. Этот объект я переопределил ToString, чтобы вернуть комбинацию из двух других свойств. Как я могу уведомить, что значение 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);
  }
}

Ответ 1

Я предполагаю, что когда вы говорите, что элемент управления привязан к ToString(), ваш объект используется как Content on ContentControl где-то внутри недоступного кода, который по умолчанию создает TextBlock, который отображает значение ToString (если вы не вы можете узнать со Snoop). Если вы создаете глобальный типизированный DataTemplate для вашего типа Person в элементе управления Resources, вы можете использовать его для отображения другого свойства, например нового свойства FullName:

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

Ответ 2

Если вы не хотите добавлять специализированное свойство для полного имени, вы должны иметь возможность использовать StringFormat в привязке. См. Пример MultiBinding в этом сообщении в блоге. [Требуется .NET 3.5 SP1]

Ответ 3

вы можете добавить третье свойство только для чтения, которое возвращает ToString(), и вызовите OnPropertyChanged с именем этого свойства

Ответ 4

Вы можете использовать множественное связывание (без конвертера) для вызова метода ToString() при изменении одного или нескольких свойств.

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

Ответ 5

Не привязывайтесь к ToString(). Вместо этого введите свойство FullName и поднимите OnPropertyChanged("FullName") в ваших других установщиках свойств.