如何在 wpf 中使用数据触发器比较 2 个字符串
How to compare 2 string using data triggers in wpf
我有两个名为 Name1 和 Name2 的属性。
如何在 XAML.
中检查这两个不使用数据触发器的属性是否具有相同的值
Name1 属性 在 Class1 中,Name2 属性 在 Class2 中。
更详细一点,
我有一个名为 Pages 的 class,它有 属性 Name1。在加载应用程序时,我将创建一个 List 对象并向该列表添加一些值。
在 XAML 中,我会将其绑定到 ItemSource。
我有另一个 class 叫做 CurrentPage,它又 属性 叫做 Name2。
在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>
如果标签的 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>
我有两个名为 Name1 和 Name2 的属性。
如何在 XAML.
中检查这两个不使用数据触发器的属性是否具有相同的值Name1 属性 在 Class1 中,Name2 属性 在 Class2 中。
更详细一点,
我有一个名为 Pages 的 class,它有 属性 Name1。在加载应用程序时,我将创建一个 List 对象并向该列表添加一些值。 在 XAML 中,我会将其绑定到 ItemSource。
我有另一个 class 叫做 CurrentPage,它又 属性 叫做 Name2。
在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>
如果标签的 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>