我有一个带有一些视图的WPF C#应用程序(xaml),尤其是一个选项视图。在此视图中,有一个隐藏所有按钮的复选框。
问题,怎么办?
我有一个MainStyle.xaml
ResourceDictionary
,包含所有样式,转换器等。我的方法是在这个文件中设置一个样式,如:
<Style TargetType="Button">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
这样可行,但用户应确定按钮是否可见。所以我必须将样式绑定到复选框。
第一步将样式绑定到ResourceDictionary(MainStyle.xaml)后面的代码。但它不起作用。我已将构造函数中的属性设置为false,但按钮是可见的。
MainStyle.xaml
<Style TargetType="Button">
<Setter Property="Visibility"
Value="{Binding ButtonsEnabled, RelativeSource={RelativeSource AncestorType=ResourceDictionary}, Converter={StaticResource BooleanVisibilityConverter}}" />
</Style>
代码背后(MainStyle.xaml.cs)
public partial class BaseStyle : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public BaseStyle()
{
InitializeComponent();
ButtonsEnabled = false; // for testing
}
private Boolean buttonsEnabled;
public bool ButtonsEnabled
{
get { return buttonsEnabled; }
set
{
buttonsEnabled = value;
NotifyPropertyChanged("ButtonsEnabled");
}
}
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
如果绑定有效,第二步是将ResourceDictionary中的样式绑定到选项视图。
答案 0 :(得分:0)
如果您无法直接从绑定中找到复选框,那么带有继承的附加属性对您有用。例如,以下XAML:
<UserControl x:Class="WpfSpikes.InheritedAttachPropertyView" x:Name="View"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfSpikes"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
<Style x:Key="VisibleButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource Self}, Path=(local:ButtonVisibility.IsVisible), Converter={StaticResource BooleanToVisibilityConverter}}"/>
</Style>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<CheckBox Content="Show Buttons?" IsChecked="{Binding ElementName=View, Path=(local:ButtonVisibility.IsVisible), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<Button Grid.Row="1" Content="Button1" Style="{StaticResource VisibleButtonStyle}"/>
<Button Grid.Row="2" Content="Button2" Style="{StaticResource VisibleButtonStyle}"/>
<Button Grid.Row="3" Content="Button3" Style="{StaticResource VisibleButtonStyle}"/>
<Button Grid.Row="4" Content="Button4" Style="{StaticResource VisibleButtonStyle}"/>
</Grid>
</UserControl>
使用此附加属性:
public static class ButtonVisibility
{
public static readonly DependencyProperty IsVisibleProperty = DependencyProperty.RegisterAttached("IsVisible", typeof(bool), typeof(ButtonVisibility), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits));
public static bool GetIsVisible(DependencyObject obj)
{
return (bool)obj.GetValue(IsVisibleProperty);
}
public static void SetIsVisible(DependencyObject obj, bool value)
{
obj.SetValue(IsVisibleProperty, value);
}
}
控制按钮的可见性。
请注意,附加属性指定FrameworkPropertyMetadataOptions.Inherits
,并且组合框在名为View
的元素(即顶级用户控件)上绑定到此属性。然后按钮样式在每个单独按钮的级别绑定到此属性(使用RelativeSource={RelativeSource Self}
),当按钮位于UserControl中时,它将获取IsVisible的继承值。
适合我。希望它有所帮助。