自定义WPF绑定未在列表框选择上更新

时间:2014-01-29 23:12:48

标签: c# wpf binding listbox dependencyobject

我对这个可能微不足道的事情感到困惑。我的自定义属性位于DevExpressesLayoutGroup的后代(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的列表框(目前包含2个项目)。

<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获取值,并将设置它(取决于选择)。< / p>

2 个答案:

答案 0 :(得分:2)

依赖项属性的getter和setter必须只包含GetValueSetValue个调用,因为有两种方法可以获取和设置它们的值:使用getter和setter并使用DependencyPropertyDependencyPropertyKey。这就是你的setter中的代码没有被执行的原因(绑定不会将它们用于依赖属性)。如果您希望在更改值时执行某些代码,请在PropertyChangedCallback中将其指定为PropertyMetadata回调。

请参阅PropertyChangedCallback Delegate on MSDN

答案 1 :(得分:1)

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

有关详细信息,请参阅XAML Loading and Dependency Properties的“自定义依赖关系属性的含义”部分