2

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 时启用。

还有另一种方法可以做到这一点吗?

4

2 回答 2

2

IsEnabled我能看到的最简单的解决方案是在您拥有的对象中创建属性,Str并且Num

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

绑定IsEnabled在你的Style

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

并且无论何时StrNum更改都会通知IsEnabled更改

于 2013-06-05T11:23:02.860 回答
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";
    }
于 2013-06-05T11:17:37.800 回答