我將一個Horizontal ItemsControl轉換爲一個Listbox,這樣我就可以選擇單個項目,但發現選擇已被打破。花了一些時間來提煉出有問題的位。列表項是值類型/結構並且包含重複項的列表框的選擇錯誤?
Books = new[] { new Book{Id=1, Name="Book1"},
new Book{Id=2, Name="Book2"},
new Book{Id=3, Name="Book3"},
new Book{Id=4, Name="Book4"},
new Book{Id=3, Name="Book3"},
};
<DataTemplate DataType="{x:Type WPF_Sandbox:Book}">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
<ListBox ItemsSource="{Binding Books}"/>
如果Book是一個結構,如果您選擇列表中具有等效結構的項目,則列表框選擇(默認模式:單一)將出錯。例如Book3
如果Book變成一個類(具有非值類型的語義),則選擇是固定的。
選擇(到目前爲止,不喜歡其中的任何):
- 我選擇結構,因爲它的一個小的數據結構和值的類型的語義是在比較實例2的相等是有用的。將其更改爲類會導致我失去值類型的語義..我無法再使用默認的Equals或者爲了成員比較而重寫它。
- 僅爲列表框選擇添加區分書屬性(例如索引)。
- 消除重複..不可能。
WPF listbox : problem with selection:指出列表框設置的SelectedItem並同時更新UI對於這一點,它只是點亮列表中的所有物品Equal(SelectedItem)
。不知道爲什麼..突出SelectedIndex會使這個問題消失;也許我錯過了一些東西。 ListBox is selecting many items even in SelectionMode="Single":顯示在列表項是字符串(值類型語義)
你說如果你使用'class',你不能重寫'Equals'。爲什麼不?強烈建議在創建'struct'時強制推薦'Equals',所以你不應該僅僅使用'struct'來獲得一個具有值語義的'Equals'實現。順便說一下,這種行爲不僅限於結構。如果綁定到覆蓋Equals的類類型,並且兩個不同的實例相同,則會看到相同的行爲。 – 2010-11-14 09:43:34
@Kent - 確切地說。我擁有的是一個簡單的數據結構,如果兩個實例具有相同的成員,則它們是等效的。直到我需要一個帶有可選項目的列表框,我才能把它變成一個類......但是如果我重寫Equals來進行成員比較,我會回到方塊1(正如我用第二個SO q鏈接)字符串列表框顯示相同的問題)。如果我不覆蓋,我需要一個customEquals方法來進行成員比較。所以它似乎像添加一個區分參數(如獨特的時間戳或索引)是最好的選擇.. – Gishu 2010-11-15 02:46:43