INotifyPropertyChanged 和 DependencyProperty 有啥关系?

Posted

技术标签:

【中文标题】INotifyPropertyChanged 和 DependencyProperty 有啥关系?【英文标题】:What is the relationship between INotifyPropertyChanged and DependencyProperty?INotifyPropertyChanged 和 DependencyProperty 有什么关系? 【发布时间】:2010-10-27 14:16:51 【问题描述】:

我正在使用 DependencyProperties 构建一个简单的 UserControl 示例,以便可以在 XAML 中更改控件的属性(代码如下)。

当然,在我的应用程序中,我不希望该控件具有紧密耦合的代码隐藏,而是用户控件将是一个名为“DataTypeWholeNumberView”的视图,并且它将拥有自己的名为“DataTypeWholeNumberViewModel”的 ViewModel。

所以我将在 ViewModel 中实现下面的 DependencyProperty 逻辑,但在 ViewModels 中我通常继承 INotifyPropertyChanged,这似乎给了我相同的功能。

那么两者是什么关系:

    将 UserControl XAML 的 DataContext 绑定到其 背后的代码,该代码具有 DependencyProperties 将 UserControl XAML(视图)的 DataContext 绑定到其 ViewModel(继承自 INotifyPropertyChanged)并具有实现 INotifyPropertyChanged 功能的属性?

XAML:

<UserControl x:Class="TestDependencyProperty827.SmartForm.DataTypeWholeNumber"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal">
            <TextBlock Text="Binding Label"/>
        </StackPanel>
    </StackPanel>
</UserControl>

代码隐藏:

using System.Windows;
using System.Windows.Controls;

namespace TestDependencyProperty827.SmartForm

    public partial class DataTypeWholeNumber : UserControl
    
        public DataTypeWholeNumber()
        
            InitializeComponent();
            DataContext = this;
        

        public string Label
        
            get
            
                return (string)GetValue(LabelProperty);
            
            set
            
                SetValue(LabelProperty, value);
            
        

        public static readonly DependencyProperty LabelProperty =
            DependencyProperty.Register("Label", typeof(string), typeof(DataTypeWholeNumber),
            new FrameworkPropertyMetadata());
    

【问题讨论】:

相关问题:***.com/questions/291518/… 【参考方案1】:

使用 WPF,您可以绑定到 DependencyProperties 或实现 INotifyPropertyChanged 的​​属性。这是一个选择问题。

因此,您的问题分为将它们放在代码后面或视图模型中。既然您提到您不希望后面有紧密耦合的代码,那么您最好拥有一个遵循 MVVM 模式的视图模型。

您甚至可以在您的视图模型中使用 DependencyProperties,就像您在后面的代码中所做的那样。

【讨论】:

【参考方案2】:

INotifyPropertyChanged 是 .Net 自 2.0 以来存在的接口。它基本上允许对象在属性更改时发出通知。引发此事件时,相关方可以执行某些操作。它的问题是它只发布属性的名称。因此,您最终会使用反射或一些不确定的 if 语句来确定在处理程序中要做什么。

DependencyProperties 是一种更精细的构造,它支持默认值、以更节省内存和性能的方式更改通知。

唯一的关系是 WPF 绑定模型支持通过 INotifyPropertyChanged 实现绑定到 DependencyProperties 或标准 Clr 属性。您的 ViewModel 也可以是 DependecyObject,第三个选项是绑定到 ViewModel 的 DependencyProperties!

Kent Boogaart 写了一个 very interesting article 来说明 ViewModel 是 POCO 还是 DependencyObject。

【讨论】:

链接好像坏了【参考方案3】:

我真的不认为 DependencyProperties 和 INotifyPropertyChanged 之间存在关系。这里唯一的魔力是 Binding 类/实用程序足够智能,可以识别 DependencyProperty 并直接绑定到它,或者订阅绑定目标的 notify-property-changed 事件并等待触发。

【讨论】:

您所做的一个障碍是您的模型不是视觉元素。 DependencyProperty 要求你从 FrameworkElement 继承,然后你需要在一些可视化树中,等等等等。如果你看得太近,这有点恶心,而且会变得很毛茸茸。 您的评论并不完全正确。您可以通过从 DependencyObject 基类继承来使用依赖属性。 您确定不在 VisualTree 中的 DependencyObject 与 FrameworkElement 的工作方式相同吗?我过去遇到过这个问题。

以上是关于INotifyPropertyChanged 和 DependencyProperty 有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

使用属性... INotifyPropertyChanged

NHibernate 和 INotifyPropertyChanged

IObservable<T> 和 INotifyPropertyChanged - 是不是存在连接

INotifyPropertyChanged 不起作用

[译]WPF MVVM 架构 Step By Step(添加actions和INotifyPropertyChanged接口)

INotifyPropertyChanged WPF