依赖属性默认值

时间:2011-04-20 08:51:40

标签: c# wpf dependency-properties

我是WPF和依赖属性的新手,我的问题可能完全是新手......

我有以下依赖属性:

    public static readonly DependencyProperty IsEditableProperty = 
        DependencyProperty.Register("IsEditable", typeof(bool), typeof(EditContactUserControl),
        new FrameworkPropertyMetadata(false, OnIsEditablePropertyChanged));

    public bool IsEditable
    {
        get { return (bool)GetValue(IsEditableProperty); }
        set { SetValue(IsEditableProperty, value); }
    }

    private static void OnIsEditablePropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        EditContactUserControl control = source as EditContactUserControl;

        bool isEditable = (bool)e.NewValue;

        if (isEditable)
            control.stackPanelButtons.Visibility = Visibility.Visible;
        else
            control.stackPanelButtons.Visibility = Visibility.Collapsed;
    }

问题是我希望OnIsEditablePropertyChanged中的代码也可以执行我的属性的默认值,但这不会发生。

我做错了什么,或者我应该如何在你的意见中做到这一点?

提前谢谢。

3 个答案:

答案 0 :(得分:3)

您应该在XAML中绑定 Visibility属性,而不是更改代码中的可见性,并使用布尔值到Visibility Converter。

如果这样做,那么属性是否初始化并不重要。

答案 1 :(得分:2)

启动时不会调用OnPropertyChanged回调:“默认”值实际上从未真正“设置”。默认值:未设置时的属性值。

如果你想在控制启动时执行一些代码,把它放在ApplyTemplate方法覆盖中(在TemplatedControl的情况下)或在构造函数的末尾(在UserControl的情况下)

避免在构造函数和属性更改的回调中复制此代码:将它放在由两者调用的公共方法中:

void OnIsEditableChangedImpl(bool newValue)
{
   ....
}

答案 2 :(得分:0)

我认为更好的方法是在XAML中设置stackPanelButtons.Visibility = Visibility.Collapsed作为默认设置,在这种情况下,您不需要在启动时运行所有这些代码!