INotifyPropertyChanged和DependencyProperty之间的关系是什么?

时间:2009-05-20 10:24:08

标签: wpf mvvm dependency-properties inotifypropertychanged

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

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

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

那么之间的关系是什么:

  1. 将UserControl XAML的DataContext绑定到其后面的代码,该代码具有DependencyProperties
  2. 将UserControl XAML(View)的DataContext绑定到 ViewModel (继承自INotifyPropertyChanged)并具有实现INotifyPropertyChanged功能的属性?
  3. 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());
        }
    }
    

3 个答案:

答案 0 :(得分:9)

INotifyPropertyChanged是一个自2.0以来存在于.Net中的接口。它基本上允许对象在属性发生变化时进行通知。当引发此事件时,感兴趣的一方可以执行某些操作。它的问题是它只发布属性的名称。因此,您最终会使用反射或一些iffy if语句来确定处理程序中的操作。

DependencyProperties是一个更复杂的构造,它支持默认值,以更节省内存和高效的方式更改通知。

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

Kent Boogaart写了一篇关于将ViewModel作为POCO与DependencyObject的very interesting article

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

所以你的问题要么是在代码背后或视​​图模型中。既然你已经提到过你不想要紧密耦合的代码,那么你最好有一个遵循MVVM模式的视图模型。

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