2011-06-10 86 views
4

一個ListView(或列表框)與以下性質混淆的SelectedItem:WPF ListView的具有相等的項目

<ListView SelectionMode="Single"> 
    <sys:String>James</sys:String> 
    <sys:String>Claude</sys:String> 
    <sys:String>Justing</sys:String> 
    <sys:String>James</sys:String> 
    </ListView> 

將導致同時選擇兩個項目,如果我點擊「詹姆斯」,即使 我選擇的SelectionMode = 「單」。當我使用一個帶有 字符串屬性的幫助類來顯示ListView時,它甚至是同樣的行爲。似乎ListView正在評估項目並選擇Equal()而不是ReferenceEqual()。有沒有辦法改變這種行爲,以便ListView可以單獨處理每個項目?

+0

我敢打賭,你的原因不是Equal()與ReferenceEqual(),而是字符串實習。 – 2011-06-10 17:09:31

+0

當我使用像tmpList.Add(new {Diplay =「James」}編程方式填充ListView並綁定在Display-Property上時,效果是一樣的,即使字符串被包裝在助手類中 – naacal 2011-06-10 18:12:06

+1

這是因爲在那裏沒有什麼可以讓詹姆斯的每個實例都是獨一無二的,你需要一個ID或者其他東西來區分這兩者 – 2011-06-10 19:26:25

回答

2

好吧,我錯了。問題確實是Equals()ReferenceEquals()

當我使用帶有字符串屬性的助手類在ListView中顯示時,這甚至是相同的行爲。

不完全。如果您使用匿名輔助類,則會得到相同的行爲。

爲什麼不圍繞字符串包裝匿名類型解決問題?如here所述,創建匿名類型時,編譯器會創建一個通用的Equals()方法,如果對象具有相同(匿名)類型並且其屬性具有相同值,則返回true

的解決方案是實現一個真正的(非匿名)類 - 它可以是這樣簡單:

public class Item 
{ 
    public string Display { get; set; } 
} 

Object.Equals()做參考比較,所以只要你不重寫,你會得到你期望的行爲。

+0

感謝您的回答和闡述,我確實使用匿名類型而不是實際的類我的測試。雖然我不明白爲什麼需要使用ListView來選擇所有值相等的項目,而不僅僅是單擊的項目。即使在設置了SelectionMode = Single的情況下,是否存在需要這種行爲的場景? – naacal 2011-06-11 06:47:29

+0

我懷疑控件的設計假定你不打算用它來顯示包含兩個相等項目的列表。至於爲什麼它使用'Equals'而不是'ReferenceEquals',我懷疑底層設計選擇與控件必須能夠顯示值類型有關。 'ReferenceEquals'框的值類型,結果'ReferenceEquals(1,1)'返回false。 – 2011-06-12 15:10:43

0

爲了獲得所需的行爲,您將需要創建一個包裝字符串類型這樣的輔助類:

public class Item 
{ 
    public Item(string name) { Name = name; } 
    public string Name { get; set; } 
} 

使用它,你現在可以做到以下幾點:

private ObservableCollection<Item> _items; 

public MainWindow() 
{ 
    InitializeComponent(); 
    _items = new ObservableCollection<Item>() { new Item("James"), new Item("John"), new Item("Steve"), new Item("Drew"), new Item("Andy"), new Item("James") }; 
    list.ItemsSource = _items; 
} 

與XAML這樣的:

<ListView SelectionMode="Single" x:Name="list" DisplayMemberPath="Name" /> 
+0

爲什麼'public item self {get {return this;}}'? – 2011-06-10 20:36:40

+0

正確 - 它不是必需的,因此從示例中刪除 – 2011-06-10 22:24:07