2010-12-22 73 views
1

比方說,我有一個類,讓我們將其命名爲父。這個類擁有另一個類的一個對象,我們稱之爲Child。孩子有一個int屬性ID。WPF:組合框,比較基於標識屬性的對象

現在這些類的實例基於數據庫表中的行。

因此,假設Parent有ID = 4的Child實例,並且在我的程序中會有一個包含所有可用Child實例的下拉列表,因此我們可以更改Parent中的實例。

問題在於,由於設計不好,帶有所有子對象的列表在獨立的場合從父級內的子實例進行實例化,因此即使它們都具有ID = 4,它也不會將它們識別爲相同的對象(因爲當然不是)。

但是,我仍然不想將相同的ID對象作爲ComboBox的默認ID對象。我當然應該以某種方式參考ID,但是在12月的黑暗月份,我有點慢,我不知道該怎麼做,因爲它仍然是我設置的對象,不僅是int值。

這裏是XAML代碼:

<DataTemplate x:Key="EditTemplate" DataType="{x:Type data:Parent}"> 
     <ComboBox ItemsSource="{Binding ElementName=Panel, Path=DataContext.ChildList}" 
           SelectedItem="{Binding Path=Child, Mode=TwoWay}" 
           SelectedValuePath="ID" DisplayMemberPath="Name" /> 
</DataTemplate> 

回答

5

所以即使它們都具有ID = 4它不會把它們識別爲同一個對象(因爲它當然是不)

聽起來根本問題是平等,重寫給定子對象的必要方法以達到適合您需要的平等定義。

public override bool Equals(object obj) 
    { 
     Child other = obj as Child; 
     if(other == null) 
     { 
     return false; 
     } 

     return (this.Id == other.Id); 
    } 

    public override int GetHashCode() 
    { 
     return this.Id.GetHashCode(); 
    } 

    public static bool operator == (Child me, Child other) 
    { 
     return Equals(me, other); 
    } 

    public static bool operator != (Child me, Child other) 
    { 
     return Equals(me, other); 
    } 
+0

嗯,當然應該工作。我一直在尋找XAML的解決方案,但是這當然可以工作,並且更加優雅。 – 2010-12-23 09:08:47

3

萬一別人遇到這一次想要一個XAML解決方案,您還可以使用SelectedValuePath和SelectedValue屬性與SelectedItem屬性一起。

<DataTemplate x:Key="EditTemplate" DataType="{x:Type data:Parent}"> 
    <ComboBox ItemsSource="{Binding ElementName=Panel, Path=DataContext.ChildList}" 
          SelectedItem="{Binding Path=Child, Mode=TwoWay}" 
          SelectedValue="{Binding Path=Child.ID, Mode=OneWay}" 
          SelectedValuePath="ID" DisplayMemberPath="Name" /> 
</DataTemplate> 

注:顯然,這不是有兩個綁定的選擇,所以請謹慎使用的最佳實踐。

+0

謝謝!不知道它是如何工作的,但它的工作原理是:-) – Endrju 2017-12-03 14:30:51