0

我正在尝试使用 VS2008 和 .NET 框架的 3.5 以编程方式突出显示 WPF listview 控件中的第一行。这是用于此的 C# 代码:

ListViewItem Val = (ListViewItem)ListView1.Items[0];
Val.IsSelected = true;

代码在第一行引发异常,这是在 ListView1 填充数据之后。异常中的消息说:

“无法将‘Message.LV1Data’类型的对象转换为‘System.Windows.Controls.ListViewItem’类型。”

LV1Data 是我用来绑定此控件中的列的类。因此,它看起来像是在尝试返回 LV1Data 对象而不是 ListViewItem 对象。有没有人对我做错了什么或我需要做什么以以编程方式突出显示列表视图行有任何建议?

下面是 ListView 控件的 XAML 代码:

<ListView x:Name="ListView1" ItemContainerStyle="{StaticResource alternatingListViewItemStyle}" AlternationCount="2" SelectionChanged="ListView1_SelectionChanged"
 SelectionMode="Multiple" HorizontalAlignment="Left" ItemsSource = "{Binding ElementName=LobbyWindow, Path=ListCollection1}">
   <ListView.View>
      <GridView>
         <GridViewColumn DisplayMemberBinding="{Binding Game}">
         <GridViewColumnHeader Content="Game" FontWeight="Bold" />
         </GridViewColumn>
         <GridViewColumn DisplayMemberBinding="{Binding Stakes}">
         <GridViewColumnHeader Content="Stakes" Width="68" FontWeight="Bold" />
         </GridViewColumn>
         <GridViewColumn Width="30" DisplayMemberBinding="{Binding Seats}">
         <GridViewColumnHeader Content="Seats" FontWeight="Bold" />
         </GridViewColumn>
      </GridView>
   </ListView.View>
</ListView>

编辑

<!-- Define the resource for the alternating background background used in the ListView objects.  -->
<StackPanel.Resources>
   <Style x:Key="alternatingListViewItemStyle" TargetType="{x:Type ListViewItem}">
      <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
      <Style.Resources>
         <!-- Foreground for Selected ListViewItem -->
         <!-- <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/> -->
         <!-- Background for Selected ListViewItem -->
         <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Green"/>
         <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Brown"/>
      </Style.Resources>
      <Style.Triggers>
         <!-- setting up triggers for alternate background colors -->
         <Trigger Property="ItemsControl.AlternationIndex" Value="1">
            <Setter Property="Background" Value="#FFD9F2BF"></Setter>
         </Trigger>
         <Trigger Property="ItemsControl.AlternationIndex" Value="2">
            <Setter Property="Background" Value="White"></Setter>
         </Trigger>
         <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="LightBlue"></Setter>
         </Trigger>
         <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="BorderBrush" Value="LightBlue" />
         </Trigger>
         <MultiTrigger>
            <MultiTrigger.Conditions>
               <Condition Property="IsSelected" Value="True"></Condition>
               <Condition Property="ItemsControl.AlternationIndex" Value="0"></Condition>
            </MultiTrigger.Conditions>
            <Setter Property="Background" Value="LightBlue"></Setter>
         </MultiTrigger>
         <MultiTrigger>
            <MultiTrigger.Conditions>
               <Condition Property="IsSelected" Value="True"></Condition>
               <Condition Property="ItemsControl.AlternationIndex" Value="1"></Condition>
            </MultiTrigger.Conditions>
            <Setter Property="Background" Value="LightGreen"></Setter>
         </MultiTrigger>
      </Style.Triggers>
      <!-- setting row height here -->
   </Style>
</StackPanel.Resources>
4

2 回答 2

2

您绑定到项目源,这意味着请求 items[x] 将返回您绑定到的数据类型(ListCollection1 中存储的任何类型)。

如果要更改它的 IsSelected,则必须在 ListCollection1 中的类型上创建该属性,并在样式或模板中绑定到它。

您创建的 IsSelected 属性必须实现为 DependencyProperty,或者它所在的类型必须实现 INotifyPropertyChanged,并在属性更改时触发该事件。

<ListView ItemsSource="...">
   <ListView.ItemContainerStyle>
      <Style TargetType="{x:Type ListViewItem}">
         <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
      </Style>
   </ListView.ItemContainerStyle>
</ListView>

然后,您将转换为该数据对象类型,并将其设置为 IsSelected 值。

在您的代码中找到ListCollection1. 它的定义看起来像List<Element>Element是您需要转换为的类型。

元素需要看起来像

public class Element : INotifyPropertyChanged
{
   private _IsSelected;
   public Boolean IsSelected 
   { 
      get { return _IsSelected; }
      set 
      { 
          _IsSelected = value; 
          if (PropertyChanged != null) 
             PropertyChanged("IsSelected");
      }
   }    

   //snip Implement interface INotifyPropertyChanged.

   //snip your other code
}

-或者-

public class Element : DependencyObject
{
    public static DependencyProperty IsSelectedProperty =
       DependencyProperty.Register("IsSelected" ...

   //snip your other code
}

那么你的代码应该是这样的。

Element Val = (Element)ListView1.Items[0];
Val.IsSelected = true;
于 2013-04-05T18:47:10.363 回答
1

Items 绑定到您的业务对象,这就是它实际上没有返回列表视图项的原因。你可以尝试三件事:

使用 SetSelectedItems并且只传入IEnumerable一个对象

或者,您可以获取对象,然后询问ListViewItem它所指的

(ListViewItem)ListView1.ItemContainerGenerator.ContainerFromItem(ListView1.Items[0])

或者,您可以绑定到该IsSelected属性并在您的视图模型中管理它

于 2013-04-05T18:46:58.040 回答