WPFListViewでプログラムでアイテムを選択します

2009年07月01日に質問されました。  ·  閲覧回数 52.1k回  ·  ソース

Paul Prewett picture
2009年07月01日

ListViewでプログラムでアイテムを選択する方法がわかりません。

リストビューのItemContainerGeneratorを使用しようとしていますが、機能していないようです。 たとえば、次の操作の後、objはnullになります。

//VariableList is derived from BindingList
m_VariableList = getVariableList();
lstVariable_Selected.ItemsSource = m_VariableList;
var obj = 
    lstVariable_Selected.ItemContainerGenerator.ContainerFromItem(m_VariableList[0]);

私は(ここや他の場所で見られた提案に基づいて)ItemContainerGeneratorのStatusChangedイベントを使用しようとしましたが、役に立ちませんでした。 イベントは発生しません。 例えば:

m_VariableList = getVariableList();
lstVariable_Selected.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
lstVariable_Selected.ItemsSource = m_VariableList;

...

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
    //This code never gets called
    var obj = lstVariable_Selected.ItemContainerGenerator.ContainerFromItem(m_VariableList[0]);
}

この全体の要点は、ListViewでいくつかのアイテムを事前に選択したいということです。

何も残さないために、ListViewはいくつかのテンプレート機能とドラッグアンドドロップ機能を使用しているので、ここにXAMLを含めます。 基本的に、このテンプレートは各アイテムをテキスト付きのテキストボックスにします。アイテムを選択すると、チェックボックスがオンになります。 また、各アイテムの下に小さなグリフが表示され、新しいアイテムが挿入されます(これはすべて正常に機能します)。

<DataTemplate x:Key="ItemDataTemplate_Variable">
<StackPanel>
    <CheckBox x:Name="checkbox"
        Content="{Binding Path=ListBoxDisplayName}"
        IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
    <Image ToolTip="Insert Custom Variable" Source="..\..\Resources\Arrow_Right.gif" 
        HorizontalAlignment="Left" 
        MouseLeftButtonDown="OnInsertCustomVariable"
        Cursor="Hand" Margin="1, 0, 0, 2" Uid="{Binding Path=CmiOrder}" />
</StackPanel>
</DataTemplate>

...

<ListView Name="lstVariable_All" MinWidth="300" Margin="5"
   SelectionMode="Multiple"
   ItemTemplate="{StaticResource ItemDataTemplate_Variable}"
   SelectionChanged="lstVariable_All_SelectionChanged"
   wpfui:DragDropHelper.IsDropTarget="True" 
   wpfui:DragDropHelper.IsDragSource="True"
   wpfui:DragDropHelper.DragDropTemplate="{StaticResource ItemDataTemplate_Variable}"
       wpfui:DragDropHelper.ItemDropped="OnItemDropped"/>

だから私は何が欠けていますか? ListViewで1つ以上のアイテムをプログラムで選択するにはどうすればよいですか?

回答

Kent Boogaart picture
2009年07月01日
33

バインドIsSelectedのプロパティListViewItemモデルのプロパティへ。 次に、コンテナの仮想化に関する潜在的な危険を含むUIの複雑さを心配するのではなく、モデルを操作するだけで済みます。

例えば:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="IsSelected" Value="{Binding IsGroovy}"/>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

ここで、モデルのIsGroovyプロパティを操作して、 ListView内のアイテムを選択/選択解除します。

Ahmad picture
2015年06月24日
6

ここで、「this」はListViewインスタンスです。 これにより、選択が変更されるだけでなく、新しく選択されたアイテムにフォーカスが設定されます。

  private void MoveSelection(int level)
  {
     var newIndex = this.SelectedIndex + level;
     if (newIndex >= 0 && newIndex < this.Items.Count)
     {
        this.SelectedItem = this.Items[newIndex];
        this.UpdateLayout();
        ((ListViewItem)this.ItemContainerGenerator.ContainerFromIndex(newIndex)).Focus();
     }
  }
Will Eddins picture
2009年07月01日
3

これが私の最善の推測です。これは、はるかに簡単な選択方法です。 何を選択しているのかわからないので、一般的な例を次に示します。

var indices = new List<int>();

for(int i = 0; i < lstVariable_All.Items.Count; i++)
{
  // If this item meets our selection criteria 
  if( lstVariable_All.Items[i].Text.Contains("foo") )
    indices.Add(i);
}

// Reset the selection and add the new items.
lstVariable_All.SelectedIndices.Clear();

foreach(int index in indices)
{
  lstVariable_All.SelectedIndices.Add(index);
}

私が見慣れているのは、設定可能なSelectedItemですが、これを設定または追加することはできませんが、このメソッドが代わりに機能することを願っています。

Mark picture
2020年07月23日
0

Bindingsを使用していない場合は、これも解決策になる可能性があります。ソースでアイテムを見つけて、リストビューのSelectedItemsプロパティに追加するだけです。

 lstRoomLights.ItemsSource = RoomLights;
 var selectedItems = RoomLights.Where(rl => rl.Name.Contains("foo")).ToList();
 selectedItems.ForEach(i => lstRoomLights.SelectedItems.Add(i));