2011-09-01 83 views
1

有這樣的代碼奇怪BindingMode =雙向行爲

public int SelectedPage 
    { 
     get { return (int)GetValue(SelectedPageeProperty); } 
     set 
     { 
      SetValue(SelectedPageeProperty, value); 
      if (NavigationCommands.Refresh.CanExecute(null, this)) 
       NavigationCommands.Refresh.Execute(null, this); 
     } 
    } 

    // Using a DependencyProperty as the backing store for SelectedPage. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty SelectedPageeProperty = 
     DependencyProperty.Register("SelectedPagee", typeof(int), typeof(DataBaseSettings), new UIPropertyMetadata(0)); 

WPF:

<ComboBox SelectedItem="{Binding Path=SelectedPage, Mode=TwoWay}" /> 

關於這個奇怪的是,如果靜態依賴屬性名爲像公共財產SelectedPage,綁定不工作。但是,如果我略微重新命名爲2ee的選擇頁面的dp它的作品。有人有一個想法可以解釋這種現象嗎?

+1

A方面說明:你不應該在依賴屬性的Setter中實現邏輯,因爲它不保證被調用。而是重寫OnPropertyChanged並在那裏做你的邏輯。 – UrbanEsc

回答

5

如果你重命名這個屬性,綁定將不會找到它,並使用CLR屬性的setter,否則將被完全忽略(這就是爲什麼你不應該有任何代碼的原因像你一樣),並且在你的包裝器中有一些刷新邏輯(正如注意的那樣不應該在那裏),這可能會刷新與綁定有關的事情,使你認爲它「起作用」。

如果您需要在屬性更改上執行其他邏輯,請將字段的元數據註冊回調爲DependencyPropertyChanged

... new UIPropertyMetadata(0, SelectedPageChanged); 

private static void SelectedPageChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    var @this = (DataBaseSettings)sender; 
    if (NavigationCommands.Refresh.CanExecute(null, @this)) 
     NavigationCommands.Refresh.Execute(null, @this); 
} 
+0

非常感謝! selectedpagechanged事件唯一的缺點是它是靜態的:/ – raphi011

+0

@ raphi011:沒有缺點,發件人會是你的對象,我會修復代碼...編輯:完成。 –

+0

太棒了!不知道,再次感謝:) – raphi011