10

問題の説明:

10個のアイテムを含むリストがあるとします。

  1. 私の最初のアクションは、2番目のアイテムを(マウスで)クリックすることです。
  2. 次に、プログラムでアイテムを選択するためのボタンがあります。

例えば:

listView.SelectedIndex = 4; 
//or
listView.SelectedItems.Add(listView.Items[4]);

アイテムが正しく選択されています。

  1. ここでShiftキーを押して最後のアイテムを選択すると、プログラムで選択されたアイテムではなく、クリックされたアイテムから選択が開始されます。

1つの解決策は、マウスクリックイベントをシミュレートすることでした。これは機能しましたが、副作用がありました。ハッキーへの道でもあります。

マウスイベントが開始アイテムを格納しているようです。

見落としているものはありますか?

4

1 に答える 1

8

この問題についてMSDNで質問しました。驚くべきことに、この問題の原因はSelectionModeです

問題はListBoxコードにある可能性があります(ListViewはListBoxから派生しています):

protected override void OnSelectionChanged(SelectionChangedEventArgs e)
{   ...
    if ((this.SelectionMode == SelectionMode.Single) && (base.SelectedItem != null))
    {
       ...
        if (selectedItem != null)
        {
            this.UpdateAnchorAndActionItem(selectedItem);
    }
}

SelectionModeがExtendedの場合、UpdateAnchorAndActionItem(selectedItem)は呼び出されません。

したがって、背後にあるコードでは、次に行う必要があります。

list.SelectionMode = SelectionMode.Single;
list.SelectedIndex = 4;
list.SelectionMode = SelectionMode.Extended;

MVVMの場合の状況がよくわかりません。

Upd1

カスタムListViewを作成しました。上記のロジック内で実行されます。この場合、MVVMでも期待どおりに機能する必要があります。お役に立てば幸いです。

public class MyListView:ListView
{
    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        //if it is multiselection than execute standard logic
        if(SelectedItems.Count!=1)
        {
            base.OnSelectionChanged(e);
            return;
        }
        var mode = SelectionMode;
        SelectionMode = SelectionMode.Single;
        base.OnSelectionChanged(e);
        SelectionMode=mode;
    }
}
于 2012-08-14T14:10:36.453 に答える