2

我对这件可能微不足道的事情感到困惑。DevExpresses我在类的后代上有我的自定义属性LayoutGroup(不应该有任何区别 IMO):

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 绑定到名为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,并将设置它(取决于选择)。

4

2 回答 2

2

依赖属性的 getter 和 setter 必须只包含GetValueandSetValue调用,因为有两种方法可以获取和设置它们的值:使用 getter 和 setter 以及使用DependencyPropertyor DependencyPropertyKey。这就是为什么不执行 setter 中的代码的原因(绑定不将它们用于依赖属性)。如果您希望在值更改时执行某些代码,请将其指定PropertyChangedCallbackPropertyMetadata.

请参阅MSDN 上的 PropertyChangedCallback 委托

于 2014-01-29T23:20:11.813 回答
1

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

有关详细信息,请参阅XAML 加载和依赖属性的“自定义依赖属性的含义”部分

于 2014-01-29T23:20:51.907 回答