wpf - 何时使用 WPF 依赖属性与 INotifyPropertyChanged

标签 wpf binding dependency-properties inotifypropertychanged

人们对何时触发一个简单的 .NET 属性有任何指导吗INotifyPropertyChanged.PropertyChanged在 View 模型中就足够了吗?那么你什么时候想升级到一个完整的依赖属性呢?还是 DPs 主要用于 View ?

最佳答案

有几种方法:

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.PropertyNameChanged

    为具有指定名称(例如 NameChanged)的每个属性引发事件。事件必须具有此名称,由您来处理/提升它们。与2类似的方法。

    4.获取绑定(bind)

    使用 FrameworkElement.GetBindingExpression()你可以得到BindingExpression目的
    并调用BindingExpression.UpdateTarget()刷新。

    第一个和第二个最有可能取决于您的目标。

    总而言之,这是视觉与数据。

    关于wpf - 何时使用 WPF 依赖属性与 INotifyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551204/

    相关文章:

    wpf - 任何免费的 3D 旋转木马控件可用吗?

    wpf - 无法将命令传递/绑定(bind)到 WPF 用户控件

    silverlight - 使用 MVVM 定期更新 silverlight View

    python - 使用 SQLAlchemy 执行查询时避免参数绑定(bind)

    c# - 使用 DynamicObject 模拟 DependencyProperties

    c# - WPF 如何使用 INotifyDataErrorInfo 在文本框旁边显示错误消息

    wpf - 双向绑定(bind) MySettings 到 DataGrid 列宽

    wpf - 如何将帮助附加到 VS 2008 中内置的 WPF 应用程序

    javascript - 在 d3 for javascript 中,如何为数据创建不同的元素?

    binding - JAXB 绑定(bind)通用转换器