我对这个可能微不足道的事情感到困惑。我的自定义属性位于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
的列表框(目前包含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>
答案 0 :(得分:2)
依赖项属性的getter和setter必须只包含GetValue
和SetValue
个调用,因为有两种方法可以获取和设置它们的值:使用getter和setter并使用DependencyProperty
或DependencyPropertyKey
。这就是你的setter中的代码没有被执行的原因(绑定不会将它们用于依赖属性)。如果您希望在更改值时执行某些代码,请在PropertyChangedCallback
中将其指定为PropertyMetadata
回调。
答案 1 :(得分:1)
依赖项属性的setter只能为其基础类型设置值。 .NET内部保留直接调用SetValue()
的权利(根据我的经验,WPF通常会这样做,而Silverlight使用您定义的setter)。
有关详细信息,请参阅XAML Loading and Dependency Properties的“自定义依赖关系属性的含义”部分