如何阻止属性值在xaml中向下流动元素树?

时间:2010-03-15 18:53:33

标签: wpf xaml composition

假设我有一些已被禁用的控件。它包含一堆元素,但我希望其中一个子元素保持启用状态。

这样的事情:

<ContentControl IsEnabled="False">
    <Border>
        <Button Content="Button" IsEnabled="True"/>
    </Border>
</ContentControl>

因此,在此示例中,Button的IsEnabled =“True”设置被其父级覆盖。有没有办法阻止这种情况发生?

这似乎是一件奇怪的事情,但我有一种情况,当一个Control被禁用而一个用户把它放在上面时,我仍然希望触发一个事件。

我在WPF Unleashed中读到,在Frame控件中包装某些东西,“..从其他UI [和]属性中分离内容,这些属性通常会在到达Frame时从元素树中继承”,但是将上面示例中的Button包装在Frame中不起作用。

我在这里走错了路吗?

2 个答案:

答案 0 :(得分:4)

这不是继承,它的构成

禁用包含控件,因此禁用所有包含的控件

启用所需的容器和控件,并禁用其他控件

答案 1 :(得分:4)

如果你可以继承按钮(或你需要的任何控件),你可以替换CoerceValue以避免这种行为(事实上,我认为IsEnabled应该像IsChecked一样工作,是一个bool ?,其中null表示使用父级值,应该保留任何特定值......但由于这不是行为,使用此解决方案将解决问题):

public sealed class InheritedButton:
  Button
{
  static InheritedButton()
  {
    InheritedButton.IsEnabledProperty.OverrideMetadata
    (
      typeof(InheritedButton),
      new FrameworkPropertyMetadata
      (
        true,
        null,
        _CoerceIsEnabled
      )
    );
  }
  private static object _CoerceIsEnabled(DependencyObject source, object value)
  {
    return value;
  }
}