Wpf 根据XAML中的单个属性更改项集合的外观

Wpf 根据XAML中的单个属性更改项集合的外观,wpf,data-binding,xaml,triggers,Wpf,Data Binding,Xaml,Triggers,我在网格中有4个按钮,其中datacontext被设置为一个对象,该对象的属性指示应该启用哪个按钮(它是可枚举的) 目前,我已经在代码隐藏中完成了这项工作,因此当特定属性发生更改时,它会根据值禁用除一个之外的所有属性。这是可行的,但我真的不喜欢把这样的东西放在代码后面。在xaml中一定有办法做到这一点 我可以为所有四个按钮创建自己的样式,然后对数据触发器执行此操作,但我更喜欢更通用的方法:对所有按钮使用相同的样式,这些样式根据按钮名称和属性值的不同而应用不同 提前感谢。您可以使用多重绑定将IsE

我在网格中有4个按钮,其中datacontext被设置为一个对象,该对象的属性指示应该启用哪个按钮(它是可枚举的)

目前,我已经在代码隐藏中完成了这项工作,因此当特定属性发生更改时,它会根据值禁用除一个之外的所有属性。这是可行的,但我真的不喜欢把这样的东西放在代码后面。在xaml中一定有办法做到这一点

我可以为所有四个按钮创建自己的样式,然后对数据触发器执行此操作,但我更喜欢更通用的方法:对所有按钮使用相同的样式,这些样式根据按钮名称和属性值的不同而应用不同


提前感谢。

您可以使用多重绑定将IsEnabled属性绑定到控件名称和DataContext中属性的组合,并创建样式将其应用于网格中的所有按钮:

<Grid.Resources>
    <local:EqualsConverter x:Key="EqualsConverter"/>
    <Style TargetType="Button">
        <Setter Property="IsEnabled">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource EqualsConverter}">
                    <Binding RelativeSource="{RelativeSource Self}" Path="Name"/>
                    <Binding Path="EnabledButtonName"/>
                </MultiBinding>
            </Setter.Value>
        </Setter>
    </Style>
</Grid.Resources>

通过对枚举值进行整数引用并为相应的按钮提供这些枚举值,可以在已创建的
enum
和按钮之间创建关联

例如:

枚举:

public enum myOptions
{
    value1 = 1,
    value2 = 2,
    value3 = 3,
    value4 = 4
}
<Button IsEnabled = {Binding Path=myProperty, 
                             Converter = {StaticResource EnumToBoolConverter}, 
                             ConverterParameter = 1} />
<Button IsEnabled = {Binding Path=myProperty, 
                             Converter = {StaticResource EnumToBoolConverter}, 
                             ConverterParameter = 2} />
public class EnumToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value == (int)parameter;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}
绑定:

public enum myOptions
{
    value1 = 1,
    value2 = 2,
    value3 = 3,
    value4 = 4
}
<Button IsEnabled = {Binding Path=myProperty, 
                             Converter = {StaticResource EnumToBoolConverter}, 
                             ConverterParameter = 1} />
<Button IsEnabled = {Binding Path=myProperty, 
                             Converter = {StaticResource EnumToBoolConverter}, 
                             ConverterParameter = 2} />
public class EnumToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value == (int)parameter;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

哇。这正是我想要的。谢谢