2012-10-09 51 views
4

列表框每秒更新一次,在工作期間,我需要選擇它的一些項目並執行一個命令,這是不可能的,因爲列表框被更新並丟失它的選定項目。更新列表框不會丟失選定的項目,WPF

ObservableCollection是我列表的ViewModel。

我心目中,或許有些選項有更好的解決方案:

  1. 列表中的檢測新項目,以傳播和增加新項目的ObservableCollection未重新初始化的ObservableCollection

  2. 檢測的變化舊的項目,並在必要時更新他們的領域。

這有點麻煩,雖然不難,但是還有其他的選擇嗎?

更新,解決方案,我有

我選擇了3-d部分:更新開始前,我保存排序的集合中選擇指標並裝入新的收集和比較與收舊。我知道,這樣做效率不高,但對於目前的應用來說,這非常合適:集合永遠不會超過數百個,通常不會超過100個。集合的每個元素都支持急切和懶惰的加載。如果有更改的項目,他們從服務器加載他們的內容,而其他內容保持不變。然後我更新可觀察集合,從服務器更新更改的項目並在視圖模型中設置選定的索引。手動選擇一個項目可以解決更新後失去焦點的問題。

回答

2

在列表更新之前保存所選項目的鍵。 在新版本的列表中找到它,並重新選擇它。 不要依賴原始引用,並允許其他人從新列表中刪除它以供選擇。

+0

我所選擇的3-d的部分:更新開始之前,我保存的排序選擇的索引收集並加載新的收藏品並與舊收藏品進行比較。我知道,這樣做效率不高,但對於目前的應用來說,這非常合適:集合永遠不會超過數百個,通常不會超過100個。集合的每個元素都支持急切和懶惰的加載。如果有更改的項目,他們從服務器加載他們的內容,而其他內容保持不變。然後我更新可觀察集合,從服務器更新更改的項目並在視圖模型中設置選定的索引。 – Dmitry

0

我正在考慮將綁定集合更改爲當前集合的新實例。一旦你開始選擇項目。一旦完成將綁定設置回原始集合

0

如果你

  1. 一類添加什麼到你的選擇:

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

  2. 目標類重新填充選擇

從物體3210

實施例:

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); 
} 
  • 不管你做出CRUD,將重新初始化類,這意味着類將容納所有向上TO-日期變化。所以之後的任何添加,更新,刪除,EXE你的函數
  • initMySelect(); 
    
    觀看時

    你選擇所選指數依然存在的選擇和u做額外的修改界面污物就會出現在你的選擇。 4.功能添加上按鈕,發送所選擇的值事件監聽器來initMySelect

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

    JSFiddle link: