如何在 wpf 中使用数据触发器比较 2 个字符串

How to compare 2 string using data triggers in wpf

我有两个名为 Name1 和 Name2 的属性。

如何在 XAML.

中检查这两个不使用数据触发器的属性是否具有相同的值

Name1 属性 在 Class1 中,Name2 属性 在 Class2 中。

更详细一点,

  1. 我有一个名为 Pages 的 class,它有 属性 Name1。在加载应用程序时,我将创建一个 List 对象并向该列表添加一些值。 在 XAML 中,我会将其绑定到 ItemSource。

  2. 我有另一个 class 叫做 CurrentPage,它又 属性 叫做 Name2。

  3. 在ItemSource.ItemTemplate中,我添加了一个标签控件来显示所有页面的名称。

    <ItemsControl ItemsSource="{Binding Pages}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,2,0,2"></StackPanel>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
       <DataTemplate>                                  
           <Label Content="{Binding Name1}" FontSize="15" FontFamily="Arial" FontWeight="DemiBold">
           <Label.Style>
              <Style TargetType="Label">
                  <Setter Property="Template">
                      <Setter.Value>
                         <ControlTemplate TargetType="Label">
                          <Border Name="Border"  HorizontalAlignment="Center" BorderBrush="Black" BorderThickness="1" CornerRadius="0,20,20,0" Width="100">
                          <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
                           </Border>
                          <ControlTemplate.Triggers>
                          <DataTrigger Binding="{Binding CurrentPage.Name2}" Value="Name1">
                               <Setter Property="Background" TargetName="Border" Value="Yellow"></Setter>
                          </DataTrigger>
                          </ControlTemplate.Triggers>
                          </ControlTemplate>
                          </Setter.Value>
                           </Setter>
               </Style>
              </Label.Style>
            </Label>
         </DataTemplate>
     </ItemsControl.ItemTemplate>
    

  4. 如果标签的 BG 颜色等于当前页面内容,我正在尝试更改它。

但我收到错误消息,样式未加载。我知道我在比较 Name2 和 Name1 的部分是错误的..() 请任何人帮助我

我觉得这是业务逻辑,在这种情况下,应该在 Model:

中处理
public bool AreTheSame
{
    get { return Name1 == Name2; }
}

然后您可以在 DataTrigger 中绑定到 AreTheSame

或者,您可以使用转换器来比较属性 Name1 和 Name2 中使用多重绑定的值:

class StringMatchConverter : IMultiValueConverter
{
    public object Convert(object [] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

        if(values.Length < 2)
        {
            return false;
        }

        for (int i = 1; i < values.Length; i++)
        {
                if (!(values[0] as string).Equals(values[i] as string))
                {
                    return false;
                }
        }

        return true;

    }

    public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

然后你可以在这些行中写一些东西:

 <MultiBinding Converter="{StaticResource StringMatchConverter}">
                        <Binding Path="Name1"/>
                        <Binding XPath="Name2" />
                    </MultiBinding>
<Label.Style>
                                                <Style TargetType="Label">
                                                    <Setter Property="Template">
                                                        <Setter.Value>
                                                            <ControlTemplate TargetType="Label">
                                                                <Border Name="Border"  HorizontalAlignment="Center" BorderBrush="Black" BorderThickness="1" CornerRadius="0,20,20,0" Width="150">
                                                                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
                                                                </Border>
                                                                <ControlTemplate.Triggers>
                                                                    <DataTrigger>
                                                                        <DataTrigger.Binding>
                                                                            <MultiBinding Converter="{StaticResource StringMatchConverter}">
                                                                                <Binding Path= "CurrentPage.Name2"/>
                                                                                <Binding Path="Name1" />
                                                                            </MultiBinding>
                                                                        </DataTrigger.Binding>
                                                                        <Setter Property="Background" TargetName="Border" Value="Yellow"></Setter>
                                                                    </DataTrigger>
                                                                </ControlTemplate.Triggers>
                                                            </ControlTemplate>
                                                        </Setter.Value>
                                                    </Setter>
                                                </Style>
                                            </Label.Style>