Привязка данных WPF: привязка к свойству, которое ссылается на два других свойства
В основном, как я могу привязать (односторонний) к текстовому полю с именем txtFullName. Первоначально любой текст в текстовом поле очищается / удаляется, так как ToString возвращает "". Но когда я делаю изменения в FirstName или LastName, это не обновляет привязку к FullName. Есть ли способ сделать это?
Кроме того, есть ли способ привязать к методу (не только поле)? То есть установить привязку непосредственно к методу ToString() и обновить его при изменении FirstName или LastName?
О, и было бы очень здорово, если бы был какой-то общий способ обработки этого... как атрибут в поле FullName или атрибут в методе ToString, сообщающий ему, какие свойства искать для изменений.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Text;
using System.Windows;
using System.Windows.Controls;
namespace AdvancedDataBinding
{
public class UserEntity
{
static UserEntity()
{
FirstNameProperty = DependencyProperty.Register("FirstName", typeof(String), typeof(UserEntity));
LastNameProperty = DependencyProperty.Register("LastName", typeof(String), typeof(UserEntity));
}
public String FirstName
{
get { return (String)GetValue(FirstNameProperty); }
set { SetValue(FirstNameProperty, value); }
}
public static readonly DependencyProperty FirstNameProperty;
public String LastName
{
get { return (String)GetValue(LastNameProperty); }
set { SetValue(LastNameProperty, value); }
}
public static readonly DependencyProperty LastNameProperty;
public String FullName
{
get { return ToString(); }
}
public override string ToString()
{
return FirstName + " " + LastName;
}
}
}
2 ответа
Как привязать текстовое поле к нескольким значениям: создайте MultiValueConverter и используйте его для привязки как к FirstName, так и LastName.
FullName не уведомляет об изменении FirstName или LastName. В вашем классе удалите все использование DependencyProperty и вместо этого сделайте так, чтобы класс реализовал INotifyPropertyChanged. Опубликуйте событие PropertyChanged для FullName при изменении FirstName или LastName. Свяжите свое текстовое поле непосредственно с FullName.
Проверьте ObjectDataProvider для "привязки" к методам.
Из этих ответов я предлагаю вам сделать второй.
Вы можете использовать MultiBinding так...
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}, {1}">
<Binding Path="LastName" />
<Binding Path="FirstName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>