Связывание 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")
в ваших других установщиках свойств.