2010-09-11 108 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); } 
}