2013-05-01 74 views
9

香港專業教育學院在這已經工作了幾天,但不能似乎想出了一個解決方案保持對焦/的SelectedItem的DataGrid的ItemsSource更改後

我有代碼上刷新每隔幾秒鐘DataGrid定時器

我試過很多刷新選項,但最終他們都失去了用戶的關注,有時也是SelectedItem

繼承人我的代碼:

 AddHandler bw.RunWorkerCompleted, Function(sender As Object, e As ComponentModel.RunWorkerCompletedEventArgs) 
               Dim lst = e.Result 
               Dim lst2 = CType(lst, List(Of Object)).OfType(Of INotifyPropertyChanged)() 
               'If Items.Count = 0 Then 
               Dim a = SelectedItem 
               Collection.Clear() 
               Collection.AddRange(lst2) 
               SelectedItem = a 
               'ItemsSource = lst 
               'End If 
               'For Each rw In lst 
               ' Dim mtch = Collection.Where(Function(x) x.GetHashCode = rw.GetHashCode) 

               'Next 

我留下評論,所以你可以看到不同的方法我試過

結果:

,如果我直接(在註釋爲)設置ItemsSource與結果,那麼SelectedItemKeyboard.FocusedElement保持穩住,直到上面的代碼的結束,但是這個代碼的結束和下一個節拍它們都變成Nothing

,如果我與ObservableCollection然後SelectedItem去介於兩者之間,我清除收集一旦丟失, Keyboard.FocusedElement只會在滴答聲之間丟失。雖然的SelectedItem可以在這裏保留有一個臨時的後盾變量

所以關鍵是我們如何從數據庫中刷新項目,同時仍保持(最重要的)鍵盤焦點

,是的,我知道, ObservableCollections未被「製造」重置。事實上,我不是真的有興趣使用一個。它只是有一個保留SelectedItem

P.S.我也嘗試過關注幾個事件(OnItemsSourceChanged,SourceUpdated ...),但他們沒有在正確的時間開除,或者根本沒有開火

有什麼想法?

ID真正最欣賞

謝謝

+0

檢查此 - http://stackoverflow.com/questions/12808479/updating-listbox-without-losing-selected-item-wpf – user1221765 2013-05-27 10:18:23

+1

謝謝,在沒有人回答這裏,我沒有在MSDN發佈,並得到了一個很好的回答,現在它的工作已經夠好了。你設置的鏈接沒有任何消息,我也考慮過將記錄1更新爲1,但還沒有得到它。無論如何感謝您的興趣! – 2013-05-28 06:52:35

+0

你好Yisman,你可以請發佈鏈接,我可以看到解決方案。它也會幫助我學習。謝謝:) – user1221765 2013-05-28 07:59:06

回答

0

你最好的選擇是:

當用戶進行選擇,節約指數或一個變量的當前selectedItem屬性。

即使在您的集合中,CollectionChanged也會將所選項目分配給之前保存在變量中的任何項目。 CollectionChanged事件是在集合發生任何更改後觸發的,因此您將能夠進行後期處理,即在此情況下重新分配所選項目。

0

您是否驗證了您的相同實例的對象?即SelectedItem必須存在於lst2。否則,您需要在新列表中找到匹配的項目,然後使用該對象。

+0

嗨。最後,我最終只改變了在db中實際更改的thos記錄的屬性。那就是訣竅。不管怎麼說,還是要謝謝你。 – 2016-12-18 08:17:37

1

您需要使用SelectedIndex而不是DataGrid的SelectedItem屬性。在用lst替換ItemsSource之前保存選定的索引。

SelectedItem不起作用的原因是這是對要替換的列表中對象的引用。

也許你不想使用索引,因爲重點項目可能會根據數據庫更新向上或向下移動。在這種情況下,您將需要使用該鍵在新列表中查找記錄的索引。

如果你不能使用索引或沒有密鑰,那麼我想不出一個好辦法做到這一點。

此外,在我看來,完全替換列表將導致其他問題。如果用戶在DataGrid單元格中鍵入內容並替換它們下面的列表,則它們將失去編輯。

+0

thnaks。最後我建立了一個'ObservableCOllection'。這成爲項目源,然後我更新observablecollection中的單個屬性和所有罰款。謝謝! – 2017-02-24 08:44:40

相關問題