更新列表框而不会丢失所选项目,WPF

时间:2012-10-09 21:10:17

标签: wpf listbox

列表框每秒更新一次,在工作期间我需要选择一些项目并执行命令,这是不可能的,因为列表框已更新并丢失了它的选定项目。

ObservableCollection是我列表中的ViewModel。

我有一些选择,也许有更好的解决方案:

  1. 检测要传播的列表中的新项目,并将新项目添加到ObservableCollection,而无需重新初始化ObservableCollection

  2. 检测旧项目中的更改并在必要时更新其字段。

  3. 这有点麻烦,虽然并不困难,但还有其他选择吗?

    更新,我有的解决方案

    我选择了3-d部分:在更新开始之前,我保存已选择的已排序集合索引并加载新集合并与旧集合进行比较。我知道,这不是很有效,但对于当前的应用程序来说,这非常合适:集合永远不会超过几百个,通常不会超过100个。集合的每个元素都支持急切和延迟加载。如果有更改的项目,他们从服务器加载他们的内容,而其他内容保持不变。然后我更新observable集合,更新服务器中更改的项目并在viewmodel中设置选定的索引。手动选择项目可以解决更新后失去焦点的问题。

4 个答案:

答案 0 :(得分:2)

在更新列表之前保存所选项目的键。 在新版本的列表中找到它,然后重新选择它。 不要依赖原始引用,并允许其他人从新列表中删除它以供选择。

答案 1 :(得分:2)

如果您更改列表框的ItemsSource中的项目顺序,有时会发生这种情况。当您暂时删除该项以将其插入其他位置时,WPF将过早地将SelectedItem设置为null。然后当你重新加入时,它就不会被选中。

以下是您可以附加到列表框的行为形式的解决方法。

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

答案 2 :(得分:0)

我正在考虑将绑定集合更改为当前集合的新实例。一旦开始选择项目。完成后将绑定设置回原始集合

答案 3 :(得分:-1)

如果你

怎么办?
  1. 在您的选择中添加一个类:

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

  2. 将课程定位为重新填充选择

  3. 来自对象的示例:

      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,都会重新初始化课程,这意味着课程将保持所有最新的变化。所以在添加,更新,删除,执行你的功能之后
    2. initMySelect();
      

      查看您的选择时,所选索引仍然会在选中,并且您所做的额外Crud更改将显示在您的选择中。 4.在按钮上添加事件监听器的功能,该选项将所选值发送到initMySelect

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

      JSFiddle link: