2014-01-29 65 views
2

我很困惑这可能是微不足道的事情。我有LayoutGroupDevExpresses类的一个子我自定义属性(不应有任何区别IMO):自定义WPF绑定不更新列表框选择

public class ExpandableLayoutGroup : LayoutGroup 
{ 
    public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register("IsExpanded", typeof(Boolean), typeof(ExpandableLayoutGroup)); 

    public Boolean IsExpanded 
    { 
     get { return (Boolean) GetValue(IsExpandedProperty); } 
     set 
     { 
      expandCheckBox.IsChecked = value; 
      SetValue(IsExpandedProperty, value); 
     } 
    } 
} 

然后,我必须XAML结合(含2项在这个时候)列表框称为listStates

<ExpandableLayoutGroup x:Name="groupTool" IsExpanded="{Binding SelectedValue.IsTool, ElementName=listStates}" DataContext="{Binding Tool}" Header="Tool" View="GroupBox" /> 

对象列表结合listStates同时包含属性(简单):

public class State 
{ 
    public Boolean IsItemTool { get; private set; } 
    public Tool Tool { get; private set; } 
} 

我失去了一些东西明显?因为我期望当我更改列表框选择(单个)时,它也会更新组中的IsExpanded属性。我有更多的子属性的工具绑定(由DataContext="{Binding Tool}"明显)和那些更新很好。因此,DataContext在列表框选择上正确更改。除了这一个属性IsExpanded(这应该展开/折叠布局组)。

我做错了什么,以及如何做到这一点,当列表框发生变化时,IsExpanded绑定被轮询从IsTool获取值,并将设置它(取决于选择)。

回答

2

getter和依赖属性的制定者只能包含GetValueSetValue电话,因为这里有两种方法来获取和设置它们的值:使用getter和setter和使用DependencyPropertyDependencyPropertyKey。这就是为什么你的setter中的代码没有执行(绑定不会将它们用于依赖属性)。如果您希望在更改值时执行某些代码,请在PropertyMetadata中将其指定为PropertyChangedCallback回调。

请参阅PropertyChangedCallback Delegate on MSDN

+0

我.. ..被定罪。我有回调设置,但它从来没有被调用,因为属性中的其他代码。现在它真的被召唤了。我从来不知道该属性必须是空的(SetValue/GetValue除外)。现在我明白了。让我进行一些测试,然后我会接受你的答案。 – SmartK8

+0

它的工作,完美。谢谢。 – SmartK8

1

依赖项属性的setter只能设置它的基础类型的值。 .NET内部机构保留直接调用SetValue()的权利(并且根据我的经验,WPF通常会这样做,而Silverlight使用您定义的setter)。

请参阅“启示自定义依赖属性” XAML Loading and Dependency Properties部分的详细

+0

如果证实了这一点,我会接受Athari,但我也会为你投票。你更快,但是我在阅读Athari的评论后才明白这个问题。 – SmartK8

+0

非常感谢。 – SmartK8