依赖属性默认值

4

我是一个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中的代码也能对我的属性的默认值执行,但实际上并没有执行。

请问我做错了什么,或者在您看来我应该如何做?

非常感谢您的帮助。


你在哪里设置默认值? - TBohnen.jnr
在创建属性时:new FrameworkPropertyMetadata(false.. 这样不够吗? - Dummy01
3个回答

3

不要在代码中更改可见性,你应该在XAML中绑定可见性属性并使用布尔值转换器。

如果这样做,属性是否初始化都无关紧要。


不错!这就是我要做的。但是我仍然觉得属性的默认值不会引发PropertyChanged事件有点不方便。无论如何...谢谢 - Dummy01

2
在启动时,OnPropertyChanged回调函数不会被调用:实际上,“默认”值从未真正“设置”。默认值是当属性未设置时的值。
如果您想在控件启动时执行一些代码,请将其放在ApplyTemplate方法重写中(在TemplatedControl的情况下)或构造函数末尾(在UserControl的情况下)。
避免在构造函数和属性更改回调中重复此代码:将其放在一个公共方法中,由两者都调用,例如:
void OnIsEditableChangedImpl(bool newValue)
{
   ....
}

谢谢。这是我目前正在做的事情,但我认为可能有一种更复杂的方法来完成这个任务,我可能错过了... - Dummy01

0
我认为一个更好的方法是在你的XAML中设置 stackPanelButtons.Visibility = Visibility.Collapsed 作为默认值,这样你就不需要在启动时运行所有这些代码了!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接