如何在ItemsControl WPF中突出显示特定的Content元素项?

问题描述

我有ItemControl,它显示切换按钮的列表,按钮名称通过绑定内容名称以数字显示。 我需要说的是要突出显示数字24的“切换”按钮。 有什么办法可以通过索引位置获取Itemscontrol并在XAML触发器中突出显示背景。 例如:点击按钮时,我想突出显示id = 9的切换按钮。

<itemsControl>
<datatemplate>
<radtoggleButton content={binding id} ischecked={binding enabled}>
</datatemplate>
</itemsControl>

有没有办法像下面这样动态命名数据模板控件项?

解决方法

比方说,您在视图模型中的项目集合为MyItemsCollection,而您的项目类型为MyItem。向您的视图模型添加属性TargetItem,以标识要突出显示的项目。

private MyItem _highlightedItem;
public MyItem HighlightedItem
{
   get => _highlightedItem;
   set
   {
      if (_highlightedItem!= value)
      {
         _highlightedItem = value;
         OnPropertyChanged();
      }
   }
}

创建一个简单的多值转换器,该对象比较对象是否相等并返回bool

public class EqualityToBooleanConverter : IMultiValueConverter
{
   public object Convert(object[] values,Type targetType,object parameter,CultureInfo culture)
   {
      return values[0] == values[1];
   }

   public object[] ConvertBack(object value,Type[] targetTypes,CultureInfo culture)
   {
      throw new InvalidOperationException("This is a one-way conversion.");
   }
}

您可以将其添加到ItemsControl的资源字典中。

<ItemsControl ItemsSource="{Binding MyItemsCollection}" ...>
   <ItemsControl.Resources>
      <local:EqualityToBooleanConverter x:Key="EqualityToBooleanConverter"/>
   </ItemsControl.Resources>
   <!-- ...your other code. -->
</ItemsControl>

根据视图模型中的DataTrigger属性,在DataTemplate中创建一个ToggleButton以突出显示HighlightedItem

<DataTemplate DataType="{x:Type local:MyItem}">
   <ToggleButton Content="{Binding Id}"
                 IsChecked="{Binding Enabled">
      <ToggleButton.Style>
         <Style TargetType="{x:Type ToggleButton}"
                BasedOn="{StaticResource {x:Type ToggleButton}}">
            <Style.Triggers>
               <DataTrigger Value="True">
                  <DataTrigger.Binding>
                     <MultiBinding Converter="{StaticResource EqualityToBooleanConverter}">
                        <Binding/>
                        <Binding Path="DataContext.HighlightItem" RelativeSource="{RelativeSource FindAncestor,AncestorType={x:Type ItemsControl}}"/>
                     </MultiBinding>
                  </DataTrigger.Binding>
                  <Setter Property="Background" Value="Yellow"/>
                </DataTrigger>
            </Style.Triggers>
         </Style>
      </ToggleButton.Style>
   </ToggleButton>
</DataTemplate>

现在,您只需通过视图模型中HighlightedItem中的索引将MyItemsCollection设置为要访问的目标项目即可。

HighlightedItem = MyItemsCollection[24];

请注意,如果要突出显示的项目实际上是要选择的项目,请考虑使用Selector之类的ListBox控件。然后,您可以使用其容器的IsSelected属性。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...