sourcecode

WPF에서 데이터 트리거에 대한 여러 조건을 제공하려면 어떻게 해야 합니까?

codebag 2023. 5. 3. 21:24
반응형

WPF에서 데이터 트리거에 대한 여러 조건을 제공하려면 어떻게 해야 합니까?

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>

@skk - "또는"을 가지려면 (A와 B) <=> ~(~A 또는 ~B) 이후의 모든 조건을 부정합니다.

그러나 부울 값이 아닌 경우 유형 변환기를 사용해 보십시오.

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

변환 방법의 값을 사용하여 원하는 조건을 생성할 수 있습니다.

@serine의 답변을 자세히 설명하고 사소한 다중값 조건으로 작업하는 방법을 설명합니다.부울 조건에 대한 항목에 "Dim-out" 오버레이를 표시해야 했습니다.NOT a AND (b OR NOT c).

배경으로, 이 질문은 "다중 선택" 질문입니다.사용자가 오답을 선택하면 사용할 수 없게 됩니다(조광되어 다시 선택할 수 없음).자동화된 에이전트는 설명(경계 강조 표시)을 제공하는 특정 선택에 초점을 맞출 수 있습니다.에이전트가 항목에 초점을 맞출 때 항목이 비활성화된 경우에도 항목이 흐리게 표시되지 않아야 합니다.초점이 맞지 않는 모든 항목은 초점이 맞지 않는 것으로 표시되므로 흐리게 표시해야 합니다.

따라서 조광 논리는 다음과 같습니다.

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);
    }
    ...
}

XAML에서 나는 이것을 사용합니다.MultiDataTrigger순식간에<Style><Style.Triggers>자원

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

이 답변은 애니메이션 전용입니다.


AND 로직을 구현하려면 MultiTrigger를 사용해야 합니다. 예는 다음과 같습니다.

속성 Text="(빈 문자열) IsKeyboardFocused="False"인 경우 몇 가지 작업을 수행하려고 하는데 코드는 다음과 같아야 합니다.

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

OR 로직을 구현하려면 몇 가지 방법이 있습니다. 이 방법은 무엇을 시도하느냐에 따라 달라집니다.

첫 번째 옵션은 여러 트리거를 사용하는 것입니다.
따라서 Text=" 또는 OR Is Keyboard Focused="False" 중 하나를 수행하고 싶다고 가정합니다.
그러면 코드는 다음과 같이 표시됩니다.

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


하지만 이 문제는 Text ISN이 null이 아니거나 IsKeyboard= 중 하나일 경우 어떻게 해야 하는지에 대한 것입니다."사실입니까? 두 번째 접근 방식을 사용하면 이를 달성할 수 있습니다.
De Morgan의 법칙을 떠올려보세요. 그것은!(!x &!y) = x || y입니다.
따라서 Text=" 및 IsKeyboard=" 때 트리거되는 다중 트리거를 작성하여 이전 문제를 해결하는 데 사용할 것입니다.사실입니다." 그리고 우리는 EX에서 우리의 행동을 할 것입니다.다음과 같은 IT 조치:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="Text" Value="" />
        <Condition Property="IsKeyboardFocused" Value="False" />
    </MultiTrigger.Conditions>
    <MultiTrigger.ExitActions>
        <!-- Do something here -->
    </MultiTrigger.ExitActions>
</MultiTrigger>

언급URL : https://stackoverflow.com/questions/905932/how-can-i-provide-multiple-conditions-for-data-trigger-in-wpf

반응형