两个MultiDataTrigger用于一个按钮

时间:2013-06-05 10:37:34

标签: wpf binding triggers datatrigger

MultiDataTrigger看起来像这样:

<Style x:Key="btnStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseBtnStyle}">
    <Setter Property="UIElement.IsEnabled" Value="False" />
    <Setter Property="Margin" Value="3,2"/>
    <Setter Property="Template" Value="{DynamicResource GrayButtonTemplate}"/>

    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Num}" Value="1"/>
                <Condition Binding="{Binding Str}"  Value="aaa"/>
            </MultiDataTrigger.Conditions>

            <Setter Property="UIElement.IsEnabled" Value="True" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

目标是只要str = aaa和Num = 1就会启用该按钮。

有效。

问题是我希望按钮启用即使Num = 2 (和str = aaa)

我尝试在第一个之后添加更多MultiDataTrigger

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Num}" Value="2"/>
        <Condition Binding="{Binding Str}"  Value="aaa"/>
    </MultiDataTrigger.Conditions>

    <Setter Property="UIElement.IsEnabled" Value="True" />
</MultiDataTrigger>

他没有提及它,该按钮仅在Num = 1时启用。

还有另一种方法吗?

2 个答案:

答案 0 :(得分:2)

我能看到的最简单的解决方案是在您的对象中创建IsEnabled属性,其中StrNum

public bool IsEnabled
{
   get
   {
      return (Num == 1 || Num == 2) && Str == "aaa";
   }
}

绑定IsEnabled

中的Style
<Setter Property="IsEnabled" Value="{Binding Path=IsEnabled}"/>

每次StrNum更改时都会通知IsEnabled更改

答案 1 :(得分:1)

使用转换器

声明IsEnabled属性的绑定
    <Style x:Key="btnStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseBtnStyle}">
        <Setter Property="UIElement.IsEnabled" Value="False" />
        <Setter Property="Margin" Value="3,2"/>
        <Setter Property="Template" Value="{DynamicResource GrayButtonTemplate}"/>
        <Setter Property="IsEnabled" Value="{Binding Converter={StaticResource myconverter}}"/>
    </Style>

由于我们没有指定Binding的路径,因此整个数据上下文对象将通过转换器。根据几个条件,您可以返回true或false,这将启用或禁用按钮。

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var foo = (foo) value;
        return (foo.num == 1 || foo.num == 2) && foo.str == "aaa";
    }