4

リストボックスは毎秒更新され、作業中にいくつかの項目を選択してコマンドを実行する必要がありますが、リストボックスが更新されて選択された項目が失われるため、これは不可能です。

ObservableCollection は私のリストの ViewModel です。

私はいくつかのオプションを念頭に置いており、おそらくより良い解決策があります:

  1. 伝播されるリスト内の新しいアイテムを検出し、ObservableCollection を再初期化せずに新しいアイテムを ObservableCollection に追加します。

  2. 古いアイテムの変更を検出し、必要に応じてフィールドを更新します。

これは難しいことではありませんが、やや面倒ですが、他に選択肢はありますか?

更新、私が持っている解決策

3 次元の部分を選択しました。更新を開始する前に、ソートされたコレクションの選択したインデックスを保存し、新しいコレクションをロードして、古いコレクションと比較します。これは効率的ではないことはわかっていますが、現在のアプリケーションでは、これは非常にうまく適合します。コレクションは数百を超えることはなく、通常は 100 を超えることはありません。コレクションの各要素は、熱心な読み込みと遅延読み込みをサポートしています。また、変更されたアイテムがある場合は、コンテンツをサーバーからロードしますが、他のアイテムはそのまま残ります。次に、監視可能なコレクションを更新し、サーバーから変更されたアイテムを更新し、ビューモデルで選択したインデックスを設定します。項目を手動で選択すると、更新後にフォーカスが失われる問題が解決されます。

4

4 に答える 4

2

これは、リスト ボックスの ItemsSource 内の項目の順序を変更した場合に発生することがあります。アイテムを一時的に削除して別の場所に挿入すると、WPF は SelectedItem を途中で null に設定します。その後、再度追加すると、選択されなくなります。

リスト ボックスにアタッチできるビヘイビアという形での回避策を次に示します。

http://www.codeproject.com/Tips/802806/Preserve-the-Selected-Item-of-a-WPF-List-Box

于 2014-08-01T16:40:54.230 に答える
2

リストが更新される前に、選択したアイテムのキーを保存します。リストの新しいバージョンでそれを見つけて、再度選択します。元の参照に頼らず、他の仲間が新しいリストからそれを削除して選択できるようにしてください。

于 2012-10-09T21:20:25.483 に答える
0

バインディング コレクションを現在のコレクションの新しいインスタンスに変更することを考えています。アイテムを選択し始めたら。終了したら、バインディングを元のコレクションに戻します

于 2012-10-09T22:01:34.893 に答える
-2

もしあなたが

  1. あなたの選択にクラスを追加します。

    <select title="" id="" class="initMySelect"> </select>

  2. 選択を再設定するためにクラスをターゲットにします

オブジェクトの例:

  var object={
  "6db01de6-a1e8-4ea6-bf01-4562b56468b9": {
    "UID": "6db01de6-a1e8-4ea6-bf01-4562b56468b9",
    "name": "aa",
    "description": "aa"
  },
  "284c3172-268a-4342-d3f0-d00fafd3d482": {
    "UID": "284c3172-268a-4342-d3f0-d00fafd3d482",
    "name": "bb",
    "description": "bb"
  },
  "b124f4df-6caa-43e8-eb97-536076b4832b": {
    "UID": "b124f4df-6caa-43e8-eb97-536076b4832b",
    "name": "cc",
    "description": "cc"
  },
  "c934634a-0775-41bd-d72a-d8900ebcbdd1": {
    "UID": "c934634a-0775-41bd-d72a-d8900ebcbdd1",
    "name": "dd",
    "description": "dd"
  },
  "fb5b8dcb-b9fb-405d-9fcf-3f551727459a": {
    "UID": "fb5b8dcb-b9fb-405d-9fcf-3f551727459a",
    "name": "ee",
    "description": "ee"
  },
  "a98f3449-bb55-46e3-b9ce-f9e2dd6d74a9": {
    "UID": "a98f3449-bb55-46e3-b9ce-f9e2dd6d74a9",
    "name": "ff",
    "description": "ff"
  }
}
function initMySelect(value) {
    var options = "";
    var selected = "";

    $.each(object, function(k, v) {
      if (value === v.UID) {
        selected = 'selected = "selected"';
      } else {
        selected = "";
      }
      options += '<option ' + selected + ' value=' + v.UID + '>' + v.name + '</option>';
    });

  $('.initMySelect').html(options);
}
  1. どんなCRUDを作成しても、クラスが再初期化されます。つまり、クラスはすべての最新の変更を保持します。したがって、関数を追加、更新、削除、実行した後
initMySelect();

選択を表示すると、選択したインデックスが選択されたままになり、追加の Crud の変更が選択に表示されます。4. 選択した値を initMySelect に送信するイベント リスナーをボタンに追加する関数

var el = document.getElementById("repopulateSelect");
el.addEventListener("click", function() {
    initMySelect(document.getElementById("selectTest").value);
}, false);

JSFミドルリンク:

于 2014-10-29T11:36:34.253 に答える