Какая связь между INotifyPropertyChanged и DependencyProperty? - PullRequest
6 голосов
/ 20 мая 2009

Я создаю простой пример UserControl с DependencyProperties, чтобы свойства элемента управления можно было изменить в XAML (код ниже).

Но, конечно, в моем приложении я не хочу, чтобы этот элемент управления имел тесно связанный код, но вместо этого пользовательский элемент управления будет представлением с именем «DataTypeWholeNumberView» и будет иметь собственный ViewModel с именем «DataTypeWholeNumberViewModel».

Итак, я собираюсь реализовать логику DependencyProperty ниже в ViewModel, но в ViewModels я обычно наследую INotifyPropertyChanged, который, кажется, дает мне ту же функциональность.

Так какова связь между:

  1. привязка DataContext из UserControl XAML к его коду за , который имеет свойства DependencyProperties
  2. привязка DataContext XAML (View) UserControl к его 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());
    }
}

Ответы [ 3 ]

9 голосов
/ 20 мая 2009

INotifyPropertyChanged - это интерфейс, который существует в .Net с 2.0. Это в основном позволяет объектам уведомлять, когда свойство изменилось. Заинтересованное лицо может выполнить определенные действия при возникновении этого события. Проблема в том, что он публикует только название объекта. Таким образом, вы в конечном итоге используете рефлексию или некоторые ненадежные операторы if, чтобы выяснить, что делать в обработчике.

DependencyProperties - более сложная конструкция, которая поддерживает значения по умолчанию, уведомления об изменениях более эффективным и быстродействующим способом.

Единственное отношение состоит в том, что модель привязки WPF поддерживает привязку либо к DependencyProperties, либо к стандартным свойствам Clr с реализацией INotifyPropertyChanged. Ваша ViewModel также может быть объектом DependecyObject, и третьим вариантом будет привязка к DependencyProperties ViewModel!

Кент Бугаарт написал очень интересную статью о том, чтобы ViewModel был POCO против DependencyObject.

2 голосов
/ 20 мая 2009

Я действительно не думаю, что есть связь между DependencyProperties и INotifyPropertyChanged. Единственная магия здесь заключается в том, что классы / утилиты Binding достаточно умны, чтобы распознавать DependencyProperty и связываться непосредственно с ним или подписываться на событие notify-property-Change объекта привязки и ожидать его запуска.

0 голосов
/ 21 марта 2012

С WPF вы можете связывать либо с DependencyProperties, либо со свойствами, которые реализуют INotifyPropertyChanged. Это вопрос выбора.

Таким образом, ваш вопрос разбивается на наличие кода в модели или в модели представления. Поскольку вы упомянули, что вам не нужен тесно связанный код, вам лучше иметь модель представления, соответствующую шаблону MVVM.

Вы можете использовать свойства DependencyProperties даже в своей модели представления так же, как в своем коде.

...