2011-04-20 133 views
3

我是新與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

你在哪裏設置默認值? – 2011-04-20 08:55:06

+0

在創建屬性時:新的FrameworkPropertyMetadata(false ..這是不夠的嗎? – Dummy01 2011-04-20 08:57:11

回答

3

代替更改代碼中的可見性,您應該在XAML中使用可見性屬性並使用布爾值到可見性轉換器。

如果你這樣做,這個屬性是否被初始化並不重要。

+0

不錯!這是我要做的。但是我仍然覺得不方便的是屬性的默認值不會引發PropertyChanged事件。無論如何...謝謝 – Dummy01 2011-04-20 10:07:59

2

OnPropertyChanged回調將不會在啓動時調用:「默認」值其實從來沒有真正「設置」。默認值:未設置時的屬性值。

如果你想執行的控制啓動一些代碼,把它放在ApplyTemplate在方法覆蓋(在TemplatedControl的情況下),或在你的構造函數結束時(在用戶控件的情況下)

避免在構造函數和屬性更改回調複製此代碼:把它放在雙方即所謂的常用方法:

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

謝謝。這是我目前正在做的,但我認爲可能有更復雜的方式來做到這一點,我可能會錯過.. – Dummy01 2011-04-20 09:05:14

+0

不要忘了標記爲已回答的問題;) – Eilistraee 2011-04-20 09:12:50

0

我認爲更好的辦法是建立在你的XAML爲默認stackPanelButtons.Visibility = Visibility.Collapsed過,在這種情況下,你不需要在啓動時運行所有這些代碼!