我正在尝试为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等,所以不仅限于按钮的解决方案是理想的。
答案 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>