我是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
中的代码也可以执行我的属性的默认值,但这不会发生。
我做错了什么,或者我应该如何在你的意见中做到这一点?
提前谢谢。
答案 0 :(得分:3)
您应该在XAML中绑定 Visibility属性,而不是更改代码中的可见性,并使用布尔值到Visibility Converter。
如果这样做,那么属性是否初始化并不重要。
答案 1 :(得分:2)
启动时不会调用OnPropertyChanged回调:“默认”值实际上从未真正“设置”。默认值:未设置时的属性值。
如果你想在控制启动时执行一些代码,把它放在ApplyTemplate方法覆盖中(在TemplatedControl的情况下)或在构造函数的末尾(在UserControl的情况下)
避免在构造函数和属性更改的回调中复制此代码:将它放在由两者调用的公共方法中:
void OnIsEditableChangedImpl(bool newValue)
{
....
}
答案 2 :(得分:0)
我认为更好的方法是在XAML中设置stackPanelButtons.Visibility = Visibility.Collapsed
作为默认设置,在这种情况下,您不需要在启动时运行所有这些代码!