DependencyProperty PropertyChangedCallback vs将代码直接放入setter

时间:2012-02-27 06:47:10

标签: wpf dependency-properties

只是想知道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 个答案:

答案 0 :(得分:4)

这不是一种不好的做法,这实际上会导致不正确的行为。绑定到XAML中的依赖项属性时,将直接调用SetValue方法,而不是setter。基本上,您无法保证甚至可以执行代码。

来源:http://www.switchonthecode.com/tutorials/wpf-tutorial-introduction-to-dependency-properties

  

这里有一点注意事项 - 除了电影之外什么也不做   GetValue和SetValue在属性包装器内调用。这是   因为你永远不知道是否有人会通过这个来设置房产   包装,或直接通过SetValue调用 - 所以你不想   在属性包装器中添加任何额外的逻辑。例如,当你设置   在XAML中依赖属性的值,它不会使用   属性包装器 - 它会直接点击SetValue调用,绕过   你碰巧放在属性包装器里的任何东西。