つまり、 ListBox.Itemsの 2 つの隣接要素を交換する方法は?
詳細は次のとおりです。
私はWPFリストボックスを使用しています。
(私はMVVMパターンを使用しています-明確にするために、この質問ではそれほど重要ではありません)
次の XAML 定義で ListBox を定義します。
<ListBox Name="listBox1"
DisplayMemberPath="Value"
ItemsSource="{Binding StringList}"
SelectedIndex="{Binding StringListSelectedItem}" />
ビュー モデルのコード フラグメントは次のとおりです。
public ObservableCollection<StringWrapper> StringList {get; set;}
private int stringListSelectedItem;
public int StringListSelectedItem
{
get {return stringListSelectedItem;}
set {
stringListSelectedItem = value;
NotifyPropertyChanged("StringListSelectedItem");
}
}
StringWrapper
リスト ボックス内の同じ文字列値の問題を回避するための小さなクラスです。
public class StringWrapper
{
public string Value { get; private set; }
public StringWrapper(string v)
{
Value = v;
}
}
リストの 2 つの要素の順序を入れ替えたい:
StringWrapper tmp = StringList[index];
StringList[index] = StringList[index - 1];
StringList[index - 1] = tmp;
このようなスワップを実行した後、に値を割り当てると、正しくない動作が得られます。UIStringListSelectedItem
のいくつかのアイテムが選択されています
が、listBox1.SelectionMode == Single
.
さらに、デバッガーで変数の値を確認すると、すべて問題ないように見えますが、アプリケーションを実行すると、ウィンドウにいくつかの選択された項目が表示されListBox
ます。
スワップ後に次のコードを実行することで修正できます。
for (int i = 0; i < vm.StringList.Count(); i++)
listBox1.SelectedIndex = i;
ただし、選択したアイテムを設定するだけでよい場合は、毎回すべてのアイテムをトラバースするのは得策ではありません。
コードの何が問題になっていますか? それは何かを壊しますか?の正しい動作を取得する方法はSelectedIndex
?
ありがとう。