2010-09-11 109 views
0

我可能會這樣做都是錯誤的......所以與我掛在一起做WPF綁定繞過依賴性屬性的代碼隱藏setter?

我正在用戶可以綁定到一個屬性的用戶控件。在屬性的setter中,我將PropertyChanged偵聽器綁定到屬性,以便對其狀態的更改作出反應。此用戶控件後面的代碼看起來是這樣的:

 public static readonly DependencyProperty NodeProperty = 
     DependencyProperty.Register("Node", typeof(MockRequirementWrapper), typeof(RecNode2)); 
    public MockRequirementWrapper Node 
    { 
     get 
     { 
      return (MockRequirementWrapper)GetValue(NodeProperty); 
     } 
     set 
     { 
      if(Node != null) 
       Node.PropertyChanged -= Update; 
      SetValue(NodeProperty, value); 
      Node.PropertyChanged += new PropertyChangedEventHandler(Update); 
      OnPropertyChanged(this, "Node"); 
     } 
    } 

然後在另一個用戶控件,我綁定到這個屬性我在其他地方創造了這樣一個節點:

<local:RecNode2 Node="{Binding}"/> 

我是什麼發現是recnode存在並且綁定到一個節點上......但是如果我在setter中放置了一個斷點,它永遠不會被調用。我誤解了這個綁定是如何工作的?如何在節點更改時添加偵聽器?

回答

1

該框架將始終直接調用GetValue和SetValue,該屬性僅僅是爲了方便,除了這些調用之外不應包含邏輯。 如果您希望在註冊DependencyProperty時進行更改,請在元數據中註冊PropertyChangedCallback。

http://msdn.microsoft.com/en-us/library/ms753358.aspx摘自:

public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
    "AquariumGraphic", 
    typeof(Uri), 
    typeof(AquariumObject), 
    new FrameworkPropertyMetadata(null, 
     FrameworkPropertyMetadataOptions.AffectsRender, 
     new PropertyChangedCallback(OnUriChanged) 
) 
); 
public Uri AquariumGraphic 
{ 
    get { return (Uri)GetValue(AquariumGraphicProperty); } 
    set { SetValue(AquariumGraphicProperty, value); } 
}