(см. Правки ниже; последний: # 2)
Он не обновляется, потому что ваш объект Person
не может ничего уведомлять об изменении значения FirstName
или LastName
. См. Этот вопрос .
А вот как вы реализуете INotifyPropertyChanged
. ( Обновлено, см. Редактировать 2 )
using System.ComponentModel;
class Person : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
string _firstname;
public string FirstName {
get {
return _firstname;
}
set {
_firstname = value;
onPropertyChanged( "FirstName", "FullName" );
}
}
string _lastname;
public string LastName {
get {
return _lastname;
}
set {
_lastname = value;
onPropertyChanged( "LastName", "FullName" );
}
}
public string FullName {
get {
return _firstname + " " + _lastname;
}
}
void onPropertyChanged( params string[] propertyNames ) {
PropertyChangedEventHandler handler = PropertyChanged;
if ( handler != null ) {
foreach ( var pn in propertyNames ) {
handler( this, new PropertyChangedEventArgs( pn ) );
}
}
}
}
Редактировать 1
На самом деле, поскольку вы обновляете имя и фамилию, и Path=FirstName
, и все это прекрасно работает, я не думаю, что вам вообще понадобится конвертер. Несколько TextBlocks
также действительны и могут работать лучше, когда вы переводите на язык с написанием справа налево.
Редактировать 2
Я понял это. Не сообщается, что свойства обновлены, потому что это привязка к самому объекту, а не к одному из этих свойств. Даже когда я сделал Person
a DependencyObject
и сделал FirstName
и LastName
DependencyProperties
, он не обновился бы.
Вы должны будете использовать свойство FullName
, и я обновил код класса Person
выше, чтобы отразить это. Тогда вы можете связать Title
. ( Примечание: Я установил объект Person
как Window
s DataContext
.)
Title="{Binding Path=FullName, Mode=OneWay}"
Если вы редактируете имена в TextBox
и хотите, чтобы имя изменилось немедленно, вместо того, чтобы TextBox
потерял фокус, вы можете сделать это:
<TextBox Name="FirstNameEdit"
Text="{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged}" />
Я знаю, что вы не хотели использовать свойство FullName
, но все, что могло бы выполнить то, что вы хотите, вероятно, было бы чем-то вроде устройства Rube Goldberg. Например, реализация INotifyPropertyChanged
и свойства Person
в самом классе Window
, прослушивание Window
события PropertyChanged
для запуска события Window
PropertyChanged
и использование Относительная привязка вроде следующего. Вы также установили бы свойство Person
до InitializeComponent()
или уволили PropertyChanged
после установки свойства Person
, чтобы оно, конечно, отображалось. (В противном случае он будет null
во время InitializeComponent()
и должен знать, когда это Person
.)
<Window.Resources>
<loc:PersonNameConverter
x:Key="conv" />
</Window.Resources>
<Window.Title>
<Binding
RelativeSource="{RelativeSource Self}"
Converter="{StaticResource conv}"
Path="Person"
Mode="OneWay" />
</Window.Title>