C# 为什么我的WPF listview代码在以编程方式选择一行时抛出一个expetion

C# 为什么我的WPF listview代码在以编程方式选择一行时抛出一个expetion,c#,wpf,listview,selection,listviewitem,C#,Wpf,Listview,Selection,Listviewitem,我试图使用VS2008和.NET framework的3.5以编程方式突出显示WPF listview控件中的第一行。以下是该项目的C#代码: ListViewItem Val = (ListViewItem)ListView1.Items[0]; Val.IsSelected = true; 代码在第一行抛出异常,该行在ListView1填充数据之后。异常中的消息显示: “无法将“Message.LV1Data”类型的对象强制转换为“System.Windows.Controls.ListV

我试图使用VS2008和.NET framework的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行,我需要做什么,有人有什么建议吗

以下是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>

项绑定到您的业务对象,因此它实际上没有返回listview项。你可以尝试三件事:

并且只传入一个对象的
IEnumerable

或者,您可以获取对象,然后请求它引用的
ListViewItem

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

或者,您可以绑定到
IsSelected
属性,并在viewmodel中管理该属性项绑定到业务对象,因此它实际上不返回listview项。你可以尝试三件事:

并且只传入一个对象的
IEnumerable

或者,您可以获取对象,然后请求它引用的
ListViewItem

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

或者,您可以绑定到
IsSelected
属性,并在您的viewmodel中管理该属性。您绑定到一个项目源,这意味着请求项目[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>
-或-

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

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

您绑定到一个items源,这意味着请求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>
-或-

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

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

是否尝试了ListView1.SelectedIndex=0?这只适用于一行,但我需要能够选择多行。是否尝试了ListView1.SelectedIndex=0?这只适用于一行,但我需要能够选择多行。在XAML代码中,它使用的是ListBox。应该是ListView,还是ListBox正确?请原谅我问这个问题,但我尝试将IsSelected属性添加到代码中。它仍然抛出一个异常。我怀疑我没有正确地或在正确的位置添加它。我已经编辑了上面的XAML代码以包含我的资源和样式。你能告诉我在XAML代码中IsSelected属性应该添加到哪里吗?停止强制转换到ListViewItem!!!创建一个具有IsSelectedProperty的对象,将其放在ListView中,并在需要设置“IsSelected”时转换为该对象。如果仍然有困难。然后参考答案。注意:这只适用于一种方式,从datavalue到ListViewItem上的IsSelected属性。在XAML代码中,它使用ListBox。应该是ListView,还是ListBox正确?请原谅我问这个问题,但我尝试将IsSelected属性添加到代码中。它仍然抛出一个异常。我怀疑我没有正确地或在正确的位置添加它。我已经编辑了上面的XAML代码以包含我的资源和样式。你能告诉我在XAML代码中IsSelected属性应该添加到哪里吗?停止强制转换到ListViewItem!!!创建一个具有IsSelectedProperty的对象,将其放在ListView中,并在需要设置“IsSelected”时转换为该对象。如果仍然有困难。然后参考答案。注意:这只适用于一种方式,从datavalue到ListViewItem上的IsSelected属性。感谢您的帮助。我尝试使用您第二个建议中的代码,但返回null。我不知道如何使用SetSelectedItems,因为该链接用于listbox,而不是ListView,并且我没有看到ListView类的SetSelectedItems方法。我还尝试绑定到IsSelected属性,但它似乎也不起作用。我已经编辑了代码,以显示我在XAML中添加IsSelected属性的位置。我做得对吗?谢谢你的帮助。我尝试使用您第二个建议中的代码,但返回null。我不知道如何使用SetSelectedItems,因为该链接用于listbox,而不是ListView,并且我没有看到ListView类的SetSelectedItems方法。我还尝试绑定到IsSelected属性,但它似乎也不起作用。我已经编辑了代码,以显示我在XAML中添加IsSelected属性的位置。我没有吗