人们对何时触发一个简单的 .NET 属性有任何指导吗INotifyPropertyChanged.PropertyChanged
在 View 模型中就足够了吗?那么你什么时候想升级到一个完整的依赖属性呢?还是 DPs 主要用于 View ?
最佳答案
有几种方法:
1.依赖属性
当您使用依赖属性时,它在具有视觉外观(UIElement
s)的元素类中最有意义。
优点:
缺点:
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.PropertyNameChanged
为具有指定名称(例如 NameChanged)的每个属性引发事件。事件必须具有此名称,由您来处理/提升它们。与2类似的方法。
4.获取绑定(bind)
使用
FrameworkElement.GetBindingExpression()
你可以得到BindingExpression
目的并调用
BindingExpression.UpdateTarget()
刷新。第一个和第二个最有可能取决于您的目标。
总而言之,这是视觉与数据。
关于wpf - 何时使用 WPF 依赖属性与 INotifyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551204/