DependencyProperty PropertyChangedCallback против размещения кода непосредственно в установщик - PullRequest
2 голосов
/ 27 февраля 2012

просто интересовался DependencyProperties.

Обычно я вижу такой стандарт кодирования при выполнении некоторого кода после изменения свойства DependencyProperty.

public int SomeProperty
    {
        get { return (int)GetValue(SomePropertyProperty); }
        set { SetValue(SomePropertyProperty, value); }
    }

    public static readonly DependencyProperty SomePropertyProperty =
        DependencyProperty.Register("SomeProperty", typeof(int), typeof(MainWindow), new UIPropertyMetadata(new DependencyPropertyChangedEventHandler(OnSomePropertyChanged)));

    private static void OnSomePropertyChanged(object obj, DependencyPropertyChangedEventArgs e)
    {
        //Some logic in here
    }

Но я не думаю, чтоЯ никогда не видел такой реализации -

public int SomeProperty
    {
        get { return (int)GetValue(SomePropertyProperty); }
        set 
        { 
            SetValue(SomePropertyProperty, value);

            //Execute code in here
        }
    }

    public static readonly DependencyProperty SomePropertyProperty =
        DependencyProperty.Register("SomeProperty", typeof(int), typeof(MainWindow), new UIPropertyMetadata(0));

Это считается плохой практикой?

Спасибо!

1 Ответ

5 голосов
/ 27 февраля 2012

Это не просто плохая практика, это фактически приведет к неправильному поведению.При связывании со свойствами зависимостей в XAML метод SetValue будет вызываться напрямую, а не установщиком.В принципе, вы не можете гарантировать, что код там даже будет выполнен.

Источник: http://www.switchonthecode.com/tutorials/wpf-tutorial-introduction-to-dependency-properties

Немного побочной заметки - никогда ничего не ставьтено вызовы GetValue и SetValue внутри оболочки свойств.Это потому, что вы никогда не знаете, будет ли кто-то устанавливать свойство через обертку или напрямую через вызов SetValue - поэтому вы не хотите помещать дополнительную логику в обертку свойства.Например, когда вы устанавливаете значение свойства зависимостей в XAML, он не будет использовать оболочку свойства - он будет напрямую вызывать вызов SetValue, минуя все, что вы поместили в оболочку свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...