| y. So we'll use it to solve the previous problem, by writing a multi trigger that it's triggered when Text="" and IsKeyboard="True", and we'll do our actions in

问题描述 投票:170回答:4
EXIT ACTIONS

, like this:

wpf datatrigger
4个回答
280
投票

如何在WPF中为数据触发提供多个条件?使用

<Style TargetType="ListBoxItem">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Path=State}" Value="WA">
        <Setter Property="Foreground" Value="Red" />
      </DataTrigger>    
      <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
          <Condition Binding="{Binding Path=Name}" Value="Portland" />
          <Condition Binding="{Binding Path=State}" Value="OR" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Background" Value="Cyan" />
      </MultiDataTrigger>
    </Style.Triggers>
  </Style>
多数据触发器

50
投票

<MultiDataTrigger.Conditions>
    <Condition Value="True">
        <Condition.Binding>
            <MultiBinding Converter="{StaticResource conditionConverter}">
                <Binding Path="Name" />
                <Binding Path="State" />
            </MultiBinding>
        </Condition.Binding>
        <Setter Property="Background" Value="Cyan" />
    </Condition>
</MultiDataTrigger.Conditions>

@jasonk - 如果你想有 "或",那么就否定所有条件,因为(A和B)<=> ~(~A或~B)

但如果你的值不是布尔值,可以尝试使用类型转换器。

22
投票

要详细说明的是 NOT a AND (b OR NOT c)@serine的回答

并说明如何处理非平凡的多值条件。我需要在布尔条件的项目上显示一个 "dim-out "叠加。.对于背景,这是一个 "多选 "问题。如果用户选择了一个错误的答案,它就变成了 "选择题"。残疾 (变暗,不能再选择)。自动代理有能力 聚焦 在任何特定的选择上给出解释(边框高亮)。当代理专注于一个项目时,它不应该被调暗。即使禁用. 所有未聚焦的项目都被标记为

偏科

NOT IsFocused AND (IsDefocused OR NOT Enabled)

,应该调暗。IMultiValueConverter因此,调光的逻辑是这样的。

// 'P' represents a parenthesis
//     !  a &&  ( b ||  !  c )
class NOT_a_AND_P_b_OR_NOT_c_P : IMultiValueConverter
{
    // redacted [...] for brevity
    public object Convert(object[] values, ...)
    {
        bool a = System.Convert.ToBoolean(values[0]);
        bool b = System.Convert.ToBoolean(values[1]);
        bool c = System.Convert.ToBoolean(values[2]);

        return !a && (b || !c);
    }
    ...
}

为了实现这个逻辑,我做了一个通用的 MultiDataTrigger 巧立名目<Style><Style.Triggers>在XAML中,我将其用于

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <!-- when the equation is TRUE ... -->
        <Condition Value="True">
            <Condition.Binding>
                <MultiBinding Converter="{StaticResource NOT_a_AND_P_b_OR_NOT_c_P}">
                    <!-- NOT IsFocus AND ( IsDefocused OR NOT Enabled ) -->
                    <Binding Path="IsFocus"/>
                    <Binding Path="IsDefocused" />
                    <Binding Path="Enabled" />
                </MultiBinding>
            </Condition.Binding>
        </Condition>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
        <!-- ... show the 'dim-out' overlay -->
        <Setter Property="Visibility" Value="Visible" />
    </MultiDataTrigger.Setters>
</MultiDataTrigger>

在...中 ResourceDictionary

<ResourceDictionary xmlns:conv="clr-namespace:My.Converters" ...>
    <conv:NOT_a_AND_P_b_OR_NOT_c_P x:Key="NOT_a_AND_P_b_OR_NOT_c_P" />
</ResourceDictionary>
资源

0
投票

本答案只适用于动画。 如果你想实现AND逻辑,你应该使用MultiTrigger,下面是一个例子。 假设我们想做一些动作,如果属性Text="" (空字符串)

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="Text" Value="" />
        <Condition Property="IsKeyboardFocused" Value="False" />
    </MultiTrigger.Conditions>
        <MultiTrigger.EnterActions>
            <!-- Your actions here -->
        </MultiTrigger.EnterActions>
</MultiTrigger>

AND

IsKeyboardFocused="False",那么你的代码应该像下面这样。如果你想实现OR逻辑,有几种方法,这取决于你想做什么。第一个选择是使用多个触发器。 所以,假设你想做一些事情,如果Text=""

<Trigger Property="IsEnabled" Value="false">
    <Setter Property="Opacity" TargetName="border" Value="0.56"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
    <Setter Property="BorderBrush" TargetName="border" 
            Value="{StaticResource TextBox.MouseOver.Border}"/>
</Trigger>

IsKeyboardFocused="False",那么你的代码应该是这样的。 但问题是,如果我想做一些事情,如果Text ISN="null IsKeyboard="True"?这可以通过第二种方法来实现。 回想一下De Morgan的规则: !(!x && !y) = x。

© www.soinside.com 2019 - 2024. All rights reserved.