Свойства зависимости C # - нужно ли проверять значение в оболочке CLR - PullRequest
2 голосов
/ 28 декабря 2010

При написании пользовательских свойств зависимостей в C # довольно распространенная оболочка выглядит примерно так:

    public string Surname
    {
        get
        {
            return this.GetValue(SurnameProperty) as string;
        }

        set
        {
            this.SetValue(SurnameProperty, value);
        }
    }

Теперь, при использовании системы NotifyPropertyChanged, я обычно проверял, изменилось ли значение в блоке 'set', перед тем как фактически зафиксировать значение и вызвать OnPropertyChanged. Должен ли я сделать то же самое для свойств зависимости? i.e.:

        set
        {
            if(this.GetValue(SurnameProperty) != value)
               this.SetValue(SurnameProperty, value);
        }

... или это что-то совершенно ненужное и уже решенное CLR? Все примеры на MSDN, которые я видел, не удосужились выполнить какую-либо проверку перед вызовом SetValue. Большое спасибо.

Ответы [ 3 ]

1 голос
/ 28 декабря 2010

Краткий ответ: нет, это уже позаботилось об этом.

На самом деле, согласно «Windows Presentation Foundation» Адама Натана, компилятор XAML зависит от функции отображения свойств во время компиляции. Однако обертки свойств .NET фактически игнорируются во время выполнения в XAML. Следовательно, вы должны избегать добавления любых видов логики в дополнение к GetValue / SetValue. Какую бы логику вы не добавили в установщик, она выполняется только в том случае, если вы вызываете свойство явно. Однако если вы связываете это свойство в XAML, среда выполнения его пропустит. Если у вас есть ошибка в вашем сеттере, это может занять некоторое время, чтобы выяснить. Пожалуйста, смотрите страницу 53, если у вас в руках эта книга.

0 голосов
/ 12 июня 2018

Заботится об изменении свойства обратного вызова. PropertyChangedCallback вызывается только при изменении значения свойства.

public static readonly DependencyProperty MyDependencyProperty =
                   DependencyProperty.Register(
                         "Dependency",
                          typeof(string),
                          typeof(MyUserControl),
                          new FrameworkPropertyMetadata("Initializing...", new PropertyChangedCallback(OnMyDependencyChangedCallBack)));
0 голосов
/ 28 декабря 2010

Нет, об этом заботится система свойств зависимостей.

...