列表框每秒更新一次,在工作期间我需要选择一些项目并执行命令,这是不可能的,因为列表框已更新并丢失了它的选定项目。
ObservableCollection是我列表中的ViewModel。
我有一些选择,也许有更好的解决方案:
检测要传播的列表中的新项目,并将新项目添加到ObservableCollection,而无需重新初始化ObservableCollection
检测旧项目中的更改并在必要时更新其字段。
这有点麻烦,虽然并不困难,但还有其他选择吗?
更新,我有的解决方案
我选择了3-d部分:在更新开始之前,我保存已选择的已排序集合索引并加载新集合并与旧集合进行比较。我知道,这不是很有效,但对于当前的应用程序来说,这非常合适:集合永远不会超过几百个,通常不会超过100个。集合的每个元素都支持急切和延迟加载。如果有更改的项目,他们从服务器加载他们的内容,而其他内容保持不变。然后我更新observable集合,更新服务器中更改的项目并在viewmodel中设置选定的索引。手动选择项目可以解决更新后失去焦点的问题。
答案 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)
如果你
怎么办?在您的选择中添加一个类:
<select title="" id="" class="initMySelect"> </select>
将课程定位为重新填充选择
来自对象的示例:
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);
}
initMySelect();
查看您的选择时,所选索引仍然会在选中,并且您所做的额外Crud更改将显示在您的选择中。 4.在按钮上添加事件监听器的功能,该选项将所选值发送到initMySelect
var el = document.getElementById("repopulateSelect");
el.addEventListener("click", function() {
initMySelect(document.getElementById("selectTest").value);
}, false);