4

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

ObservableCollection 是我列表的 ViewModel。

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

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

  2. 检测旧项目的变化并在必要时更新它们的字段。

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

更新,我有的解决方案

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

4

4 回答 4

2

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

于 2012-10-09T21:20:25.483 回答
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 回答
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,都会重新初始化该类,这意味着该类将保存所有最新更改。所以在任何添加,更新,删除,exe你的功能之后
initMySelect();

查看您的选择时,选定的索引仍将存在,并且您所做的额外 Crud 更改将出现在您的选择中。4. 在按钮上添加事件侦听器的功能,将选定的值发送到 initMySelect

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

JSFiddle 链接:

于 2014-10-29T11:36:34.253 回答