2009-11-16 82 views
2

我有一個聲明綁定到文本框的WPF列表框控件。列表框的ItemsSource是一個從XML文件構建的ObservableCollection。添加新項目時,我可以輕鬆地防止列表框中的重複條目,因爲我可以在「添加」按鈕的Click事件處理程序中檢查它。如何防止WPF Listbox控件中的重複項?

但是,當一個現有項目的值在文本框(顯然顯示列表框的選定項目)中更改爲列表中已存在的項目時,我想防止這種情況,但我不知道如何。

我很感謝幫助!

回答

3

您可以通過從ValidationRule派生出來並將其應用於文本框的綁定來創建自己的驗證規則。在Validate方法中,您可以檢查重複項並返回false的ValidationResult以防止更新綁定源。

+0

這是做到這一點的方法!看看這裏:http://msdn.microsoft.com/en-us/library/ms753962.aspx – Dabblernl 2009-11-16 19:43:48

+0

糾正我,如果我錯了,但做驗證規則不關心自己的特定列表項的值,而不是清單本身?換句話說,當項目不知道它是列表的一部分時,我將如何檢查包含項目的列表中的重複項的驗證規則? – 2009-11-17 05:09:40

2

收聽CollectionChanged事件,並檢查集合何時被修改,如果有任何重複並將其刪除。

此外,您可以看看this問題及其「可觀察集合的答案」,它的'項目'屬性更改時也會通知您。

編輯:

如果你不想用我上面提到的集合,可以確保您收集的項目實施INotifyPropertyChanged和每次添加一個項目到集合時間,聽其PropertyChanged事件。在處理程序中,檢查是否更改的屬性是ListBox中顯示的屬性,並檢查是否有其他元素具有該屬性的相同值。如果你找到了這樣一個元素,你可以將你的屬性值更改爲舊值,或者完全刪除元素,這取決於你的應用程序的邏輯。

+0

我認爲這是行不通的 - 因爲文本框綁定到一個項目,你根本沒有改變集合。您必須刪除/讀取要觸發的CollectionChanged的項目。 – 2009-11-16 11:53:27

+0

是的,但您可以使用Observable集合實現來通知元素的修改。我編輯了我的答案以反映這一點。 – luvieere 2009-11-16 11:58:48

+0

我看過索倫的解決方案,它看起來很有希望。然而,我缺乏C#經驗,無法擴展他的ObservableCollectionEx類來爲我工作。例如,他的ReactToChange事件處理程序沒有使用任何屬性,因此如何知道哪個項目觸發了事件以及哪些屬性發生了更改? – 2009-11-17 06:00:10