it-source

값이 null이 아닌 데이터 트리거?

criticalcode 2023. 5. 21. 11:36
반응형

값이 null이 아닌 데이터 트리거?

나는 값이 NULL인지 확인하는 세터를 만들어 무언가를 할 수 있다는 것을 알고 있습니다.예:

<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"과 같이?그것이 XAML에서 가능합니까?

결과:당신의 답변에 감사합니다...저는 가치 변환기를 할 수 있다는 것을 알고 있었습니다(즉, 코드를 입력해야 하며, 그것은 제가 기대했던 것처럼 순수한 XAML이 아닐 것입니다).하지만, 그것은 순수한 XAML에서는 그것을 할 수 없다는 사실상 "아니오"라는 질문에 대한 답입니다.그러나 선택한 답변은 이러한 기능을 만드는 가장 좋은 방법을 보여줍니다.좋은 발견입니다.

이것은 약간 속임수이지만 기본 스타일을 설정한 다음 값이 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>

IV ValueConverter를 사용하여 다음 작업을 수행할 수 있습니다.

<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와 동일한지 확인하는 IVValueConverter를 구현하여 null뿐만 아니라 모든 항목에 대해 확인할 수 있습니다.

DataTrigger에서도 비슷한 한계에 부딪혔는데, 동일성만 확인할 수 있는 것 같습니다.제가 본 가장 가까운 것은 평등 이외의 다른 유형의 비교를 하는 기술입니다.

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

데이터 트리거의 이러한 한계는 컨버터를 사용하여 데이터를 마사지하여 로버트 맥니의 답변에 제시된 것과 같이 비교할 수 있는 특수 값으로 어느 정도 해결할 수 있습니다.

null과 비교(Michael Nunan이 말했듯이):

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

사용할 수 있습니다.DataTriggerMicrosoft 클래스입니다.표정.Expression Blend와 함께 제공되는 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을 참조해야 합니다.

시스템. 윈도우.Interactivity.dll

마이크로소프트.표현.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>

저는 여기서 역논리를 사용했습니다.내 콤보 항목이 채워지지 않았을 때 스택 패널을 보이지 않게 설정하는 것은 꽤 잘 작동합니다!

그만! 변환기 안 돼요!저는 이 사람의 라이브러리를 "팔고" 싶지 않지만, XAML에서 자료를 비교하고 싶을 때마다 컨버터를 하는 것이 싫었습니다.

그래서 이 도서관과 함께: https://github.com/Alex141/CalcBinding .

당신은 그것을 할 수 있습니다 [그리고 더 많은 것들]:

첫째, 창/사용자 컨트롤 선언에서 다음을 수행합니다.

<Windows....
     xmlns:conv="clr-namespace:CalcBinding;assembly=CalcBinding"
>

텍스트 블록에서

<TextBlock>
      <TextBlock.Style>
          <Style.Triggers>
          <DataTrigger Binding="{conv:Binding 'MyValue==null'}" Value="false">
             <Setter Property="Background" Value="#FF80C983"></Setter>
          </DataTrigger>
        </Style.Triggers>
      </TextBlock.Style>
    </TextBlock>

마법의 부분은 다음과 같습니다.바인딩 'MYValue==hosts'입니다.사실, 당신은 당신이 원하는 어떤 조건도 설정할 수 있습니다.

제가 타사의 팬은 아니지만 이 라이브러리는 무료이며 영향이 거의 없습니다(프로젝트에 2.dll 추가).

내 솔루션은 DataContext 인스턴스(또는 MVVM을 사용하는 경우 ViewModel)에 있습니다.원하는 Not Null 조건이 충족되면 true를 반환하는 속성을 추가합니다.

    Public ReadOnly Property IsSomeFieldNull() As Boolean
        Get
            Return If(SomeField is Null, True, False)
        End Get
    End Property

데이터 트리거를 위 속성에 바인딩합니다.참고: VB.NET에서는 Null 객체에서는 작동하지 않는 If 및 NOT 연산자 IIF 함수를 사용해야 합니다.그러면 XAML은 다음과 같습니다.

    <DataTrigger Binding="{Binding IsSomeFieldNull}" Value="False">
      <Setter Property="TextBlock.Text" Value="It's NOT NULL Baby!" />
    </DataTrigger>

IV ValueConverter를 사용하지 않는 솔루션을 찾고 있는 경우 항상 아래 메커니즘을 사용할 수 있습니다.

       <StackPanel>
            <TextBlock Text="Border = Red when null value" />
            <Border x:Name="border_objectForNullValueTrigger" HorizontalAlignment="Stretch" Height="20"> 
                <Border.Style>
                    <Style TargetType="Border">
                        <Setter Property="Background" Value="Black" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ObjectForNullValueTrigger}" Value="{x:Null}">
                                <Setter Property="Background" Value="Red" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            </Border>
            <TextBlock Text="Border = Green when not null value" />
            <Border HorizontalAlignment="Stretch" Height="20">
                <Border.Style>
                    <Style TargetType="Border">
                        <Setter Property="Background" Value="Green" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Background, ElementName=border_objectForNullValueTrigger}" Value="Red">
                                <Setter Property="Background" Value="Black" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            </Border>
            <Button Content="Invert Object state" Click="Button_Click_1"/>
        </StackPanel>

변환기:

public class NullableToVisibilityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? Visibility.Collapsed : Visibility.Visible;
    }
}

바인딩:

Visibility="{Binding PropertyToBind, Converter={StaticResource nullableToVisibilityConverter}}"

다음과 같은 방법으로 View 모델에서 변환기를 사용하거나 새 속성을 생성할 수 있습니다.

public bool CanDoIt
{
    get
    {
        return !string.IsNullOrEmpty(SomeField);
    }
}

사용:

<DataTrigger Binding="{Binding SomeField}" Value="{Binding CanDoIt}">

언급URL : https://stackoverflow.com/questions/356194/datatrigger-where-value-is-not-null

반응형