如何在wpf

时间:2015-08-10 11:11:11

标签: wpf xaml datatrigger multidatatrigger

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

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

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

更详细,

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

  2. 我有另一个名为CurrentPage的类,它又具有名为Name2的属性。

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

    <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颜色,如果它等于当前页面内容。

  5. 但是我收到错误并且样式没有加载。我知道在比较Name2和Name1时我错了。() 请任何人帮助我

3 个答案:

答案 0 :(得分:1)

或者,您可以使用转换器在属性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>

答案 1 :(得分:0)

听起来像这是业务逻辑,在这种情况下,这应该在模型中处理:

public bool AreTheSame
{
    get { return Name1 == Name2; }
}

然后,您可以绑定到AreTheSame中的DataTrigger

答案 2 :(得分:0)

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