Есть несколько подходов:
1. Свойство зависимости
Когда вы используете свойство зависимостей, оно имеет смысл в элементах-классах, которые имеют визуальный вид (UIElement
s).
Плюсы:
- WPF сделает всю логику за вас
- Некоторые механизмы, например анимация, используют только свойство зависимостей
- Подходит для стиля ViewModel
Минусы:
- Вам нужно получить форму
DependencyObject
- Немного неудобно для простых вещей
Пример:
public static class StoryBoardHelper
{
public static DependencyObject GetTarget(Timeline timeline)
{
if (timeline == null)
throw new ArgumentNullException("timeline");
return timeline.GetValue(TargetProperty) as DependencyObject;
}
public static void SetTarget(Timeline timeline, DependencyObject value)
{
if (timeline == null)
throw new ArgumentNullException("timeline");
timeline.SetValue(TargetProperty, value);
}
public static readonly DependencyProperty TargetProperty =
DependencyProperty.RegisterAttached(
"Target",
typeof(DependencyObject),
typeof(Timeline),
new PropertyMetadata(null, OnTargetPropertyChanged));
private static void OnTargetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Storyboard.SetTarget(d as Timeline, e.NewValue as DependencyObject);
}
}
2. System.ComponentModel.INotifyPropertyChanged
Обычно при создании объекта данных вы используете этот подход. Это простое и аккуратное решение для подобных вещей.
Плюсы и минусы - дополняют 1. Вам нужно реализовать только одно событие (PropertyChanged).
Образец:
public class Student : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
}
private string name;
public string Name;
{
get { return name; }
set {
name = value;
OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
3.PropertyName Изменено
Повышение события для каждого свойства с указанным именем (например, NameChanged). Событие должно иметь это имя, и вы должны его обработать / поднять. Подобный подход как 2.
4. Получи переплет
Используя FrameworkElement.GetBindingExpression()
, вы можете получить объект BindingExpression
и позвоните BindingExpression.UpdateTarget()
, чтобы обновить.
Первое и второе наиболее вероятны в зависимости от вашей цели.
В целом, это Visual против данных.