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

时间:2010-07-05 11:53:10

标签: wpf data-binding xaml triggers

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

Currenty我已经在代码隐藏中完成了这项工作,因此当特定属性发生更改时,它会根据值禁用除一个属性之外的所有属性。它可以工作,但我真的不喜欢把这样的东西放到代码隐藏中。必须有一种方法可以在xaml中执行此操作吗?

我可以为所有四个按钮创建自己的样式,然后使用数据触发器执行此操作,但我更喜欢更通用的方法:对所有按钮使用相同的样式,以某种方式应用不同,具体取决于,例如,按钮名称和值财产。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以使用MultiBinding将IsEnabled属性绑定到控件名称和DataContext中属性的组合,并创建一个Style以将其应用于Grid中的所有按钮:

<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>

在代码中:

public class EqualsConverter
    : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return values.Length == 2 && object.Equals(values[0], values[1]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

答案 1 :(得分:1)

您可以通过对枚举值进行整数引用并将这些枚举值设为ConverterParameters来为相应的按钮创建您创建的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;
    }
}