[wpf] 값이 null이 아닌 DataTrigger?

값이 NULL인지 확인하고 무언가를 수행하는 setter를 만들 수 있다는 것을 알고 있습니다. 예:

<TextBlock>
  <TextBlock.Style>
    <Style>
      <Style.Triggers>
        <DataTrigger Binding="{Binding SomeField}" Value="{x:Null}">
          <Setter Property="TextBlock.Text" Value="It's NULL Baby!" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TextBlock.Style>
</TextBlock>

그러나 “NOT NULL”또는 “NOT = 3″과 같이 “not”값을 어떻게 확인할 수 있습니까? XAML에서도 가능합니까?

결과 : 귀하의 답변에 감사드립니다 … 나는 가치 변환기를 사용할 수 있다는 것을 알고있었습니다. 그러나 순수한 XAML에서는 효과적으로 “아니오”라는 질문에 답할 수 있습니다. 그러나 선택된 대답은 아마도 그런 종류의 기능 을 만드는 가장 좋은 방법 일 것입니다 . 잘 찾았어요



답변

DataTriggers와 비슷한 한계에 부딪 쳤으며 평등 만 확인할 수있는 것 같습니다. 내가 본 가장 가까운 것은 평등 이외의 다른 유형의 비교를 수행하는 기술입니다.

이 블로그 게시물 은 DataTrigger에서 LT, GT 등과 같은 비교를 수행하는 방법을 설명합니다.

Robert Macnee의 답변에서 제안한 것처럼 DataTrigger의 이러한 제한은 변환기를 사용하여 데이터를 사용자가 비교할 수있는 특별한 값으로 마사지함으로써 어느 정도 해결 될 수 있습니다.


답변

이를 위해 IValueConverter를 사용할 수 있습니다.

<TextBlock>
    <TextBlock.Resources>
        <conv:IsNullConverter x:Key="isNullConverter"/>
    </TextBlock.Resources>
    <TextBlock.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding SomeField, Converter={StaticResource isNullConverter}}" Value="False">
                    <Setter Property="TextBlock.Text" Value="It's NOT NULL Baby!"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

IsNullConverter가 다른 곳에 정의되어 있고 conv가 네임 스페이스를 참조하도록 설정된 경우 :

public class IsNullConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value == null);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new InvalidOperationException("IsNullConverter can only be used OneWay.");
    }
}

보다 일반적인 해결책은 ConverterParameter와의 동등성을 확인하는 IValueConverter를 구현하는 것이므로 null이 아닌 모든 것을 확인할 수 있습니다.


답변

이것은 약간의 속임수이지만 기본 스타일을 설정하고 값이 null 인 경우 DataTrigger를 사용하여 대체합니다.

  <Style>
      <!-- Highlight for Reviewed (Default) -->
      <Setter Property="Control.Background" Value="PaleGreen" />
      <Style.Triggers>
        <!-- Highlight for Not Reviewed -->
        <DataTrigger Binding="{Binding Path=REVIEWEDBY}" Value="{x:Null}">
          <Setter Property="Control.Background" Value="LightIndianRed" />
        </DataTrigger>
      </Style.Triggers>
  </Style>


답변

null과 비교하십시오 (Michael Noonan이 말했듯이).

<Style>
    <Style.Triggers>
       <DataTrigger Binding="{Binding SomeProperty}" Value="{x:Null}">
           <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
     </Style.Triggers>
</Style>

변환기가없는 null이 아닌 비교 :

<Style>
    <Setter Property="Visibility" Value="Collapsed" />
    <Style.Triggers>
       <DataTrigger Binding="{Binding SomeProperty}" Value="{x:Null}">
           <Setter Property="Visibility" Value="Visible" />
        </DataTrigger>
     </Style.Triggers>
</Style>


답변

목록보기 항목이 선택된 경우 (예 : null이 아닌) 버튼을 활성화하기 위해 이것을 사용하고 있습니다.

<Style TargetType="{x:Type Button}">
    <Setter Property="IsEnabled" Value="True"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=lvMyList, Path=SelectedItem}" Value="{x:Null}">
            <Setter Property="IsEnabled" Value="False"/>
        </DataTrigger>
    </Style.Triggers>
</Style>


답변

Expression Blend 와 함께 제공 DataTrigger되는 Microsoft.Expression.Interactions.dll 클래스를 사용할 수 있습니다 .

코드 샘플 :

<i:Interaction.Triggers>
    <i:DataTrigger Binding="{Binding YourProperty}" Value="{x:Null}" Comparison="NotEqual">
       <ie:ChangePropertyAction PropertyName="YourTargetPropertyName" Value="{Binding YourValue}"/>
    </i:DataTrigger
</i:Interaction.Triggers>

당신이에 대해 실행할 수있는이 방법을 사용 GreaterThan하고 LessThan너무합니다. 이 코드를 사용하려면 두 개의 dll을 참조해야합니다.

System.Windows.Interactivity.dll

Microsoft.Expression.Interactions.dll


답변

<StackPanel.Style>
  <Style>
    <Setter Property="StackPanel.Visibility" Value="Visible"></Setter>
    <Style.Triggers>
      <DataTrigger  Binding="{Binding ElementName=ProfileSelectorComboBox, Path=SelectedItem.Tag}" Value="{x:Null}">
          <Setter Property="StackPanel.Visibility" Value="Collapsed"></Setter>
      </DataTrigger>
    </Style.Triggers>
  </Style>
</StackPanel.Style>

방금 역 논리를 사용했습니다 … 내 콤보 템이 채워지지 않을 때 스택 패널을 보이지 않게 설정하면 꽤 잘 작동합니다!