按钮的依赖属性

时间:2013-03-26 08:27:31

标签: c# wpf dependency-properties

我正在尝试为Buttons创建一个名为“IsVisibleWhenReadOnly”的布尔属性。我希望在StackPanel中的按钮上使用它,因此它们可以是可见的,也可以不是,这取决于数据是否处于ReadOnly状态。即,在ReadOnly状态下,保存和取消按钮被隐藏,但编辑按钮是可见的。单击“编辑”按钮时,ReadOnly状态变为false,“取消”和“保存”按钮变为“可见”,“编辑”按钮处于“隐藏”状态。

我的物业代码:

public bool IsVisibleWhenReadOnly
{
  get { return (bool)GetValue(IsVisibleWhenReadOnlyProperty); }
  set { SetValue(IsVisibleWhenReadOnlyProperty, value); }
}

// Using a DependencyProperty as the backing store for IsVisibleWhenReadOnly.
public static readonly DependencyProperty IsVisibleWhenReadOnlyProperty =
    DependencyProperty.Register("IsVisibleWhenReadOnly",
                                 typeof(bool), 
                                 typeof(Button), 
                                 new PropertyMetadata(true));

按钮样式:

<Style TargetType="{x:Type Button}">
  <Setter Property="Visibility">
    <Setter.Value>
      <Binding Path="IsVisibleWhenReadOnly" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Window}" Mode="OneWay">
        <Binding.Converter>
          <utils:BoolToVisibilityConverter/>
        </Binding.Converter>
      </Binding>
    </Setter.Value>
  </Setter>
</Style>

和按钮代码:

<Button Name="btnEdit" Content="Edit" MinWidth="75" Height="25" 
    Click="btnEdit_Click" IsVisibleWhenReadOnly="true" />

IsReadOnly是另一个令人愉快的依赖属性,并根据其值启用/禁用控件,但我希望这会影响可见性,而不是启用。

不幸的是,我在编译时遇到了三个错误:

The member "IsVisibleWhenReadOnly" is not recognized or is not accessible.
The property 'IsVisibleWhenReadOnly' does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'.
The property 'IsVisibleWhenReadOnly' was not found in type 'Button'.

我猜它在typeOf(Button),行,但将其更改为'BaseWindow'(我的'IsReadOnly'属性的typeOf()值)没有任何区别。我也很确定我的BoolToVisibilityConverter不是问题。

任何人都可以看到我做错了什么并指出了正确的方向吗?

编辑:如果可能的话,我想使用不只是按钮的依赖属性。例如,StackPanels,CheckBoxes等,所以不仅限于按钮的解决方案是理想的。

2 个答案:

答案 0 :(得分:1)

如果你想重新使用现有的控件,你应该使用attached dependency property。如下所示:

public static void SetIsVisibleWhenReadOnly(UIElement element, bool value)
{
    element.SetValue(IsVisibleWhenReadOnlyProperty, value);
}
public static bool GetIsVisibleWhenReadOnly(UIElement element)
{
    return (bool)element.GetValue(IsVisibleWhenReadOnlyProperty);
}
// Using a Registerd DependencyProperty as the backing store for IsVisibleWhenReadOnly.
public static readonly DependencyProperty IsVisibleWhenReadOnlyProperty =
        DependencyProperty.RegisterAttached("IsVisibleWhenReadOnly",
                                     typeof(bool),
                                     typeof(Button),
                                     new PropertyMetadata(true));

我还会考虑可见性转换器的多重绑定,因此在确定要返回的Visiblity值时,您可以访问IsReadOnly和IsVisibileWhenReadOnly。

答案 1 :(得分:1)

您必须将DependancyProperty注册为AttachedProperty,如果您想在其他控件上使用它,请使用typeof(FrameworkElement)代替typeof(Button)

 public static readonly DependencyProperty IsVisibleWhenReadOnlyProperty =
    DependencyProperty.RegisterAttached("IsVisibleWhenReadOnly"
     , typeof(bool), typeof(FrameworkElement),new PropertyMetadata(true));

但使用DataTrigger

可能更简单

示例:

<Button>
    <Style TargetType="{x:Type Button}">
        <Setter Property="Visibility" Value="Visible" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsVisibleWhenReadOnly}" Value="True" >
                <Setter Property="Visibility" Value="Collapsed" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Button>