2011-10-27 29 views
0

我有在Silverlight如何在組合框中處理重複項目

我有這樣定義它Telerik的組合框的麻煩,

<telerik:RadComboBox SelectedItem="{Binding Organisation, Mode=TwoWay}" ItemsSource="{Binding Organisations}" DisplayMemberPath="Name" /> 

並綁定到這個樣子的SelectedItem屬性,

[Required(ErrorMessage = "The organisation is required.")] 
public OrganisationEntity Organisation 
{ 
    get 
    { 
     return utilityOwnerOrganisation; 
    } 
    set 
    { 
     utilityOwnerOrganisation = value; 
     RaisePropertyChanged(this, x => x.UtilityOwnerOrganisation); 
    } 
} 

的OrganisationEntity是這樣的,

public class OrganisationEntity 
{ 
    public string Name { get; set; } 
    public int OrganisationId { get; set; } 
} 

問題就出現了,如果列表組織在像這樣定義了兩個組織,

new OrganisationEntity() { Name = "Wellington City Council", OrganisationId = 34 } 
new OrganisationEntity() { Name = "Wellington City Council", OrganisationId = 31 } 

如果我有兩個項目具有相同的名稱列表中,並設置組織屬性(從視圖模型)是OrganisationId = 31的項目將從綁定引擎中調用setter,並選擇其他項目。

原因是因爲DisplayMemberPath被設置爲Name。它將Name視爲一個關鍵字,並假定它在組合框中是唯一的,但事實並非如此。

如果我拿出DisplayMemberPath它的工作,但組合框然後顯示錯誤的東西。

如果我取出DisplayMemberPath並定義ToString方法以返回OrganisationEntity中的Name屬性,則會發生同樣的情況。

+1

如何你要用戶做區分哪些組織實體之間,他們正在選擇?這聽起來更像是一個設計問題,而不是一個wpf問題。 – Marius

+0

當然,同意。這是一個設計問題,因爲我們數據庫中的數據有重複。我們將解決這個長期問題。我們需要在列表中包含兩個項目的原因是因爲我們數據庫中的其他錶鏈接到這些組織實體。該組合所在的彈出窗口也有其他記錄,並且需要確保選擇正確的鏈接。 – peter

回答

1

嘗試刪除的DisplayMemberPath和使用一個DataTemplate,以顯示你想要什麼,而不是:

<ComboBox ItemsSource="{Binding Organisations}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 
+0

我已經探索過這個選項。該特定的模板ItemTemplate似乎控制了組合框的列表框部分中顯示的內容,而不是主文本框。是否有另一個模板控制主文本框 - 我無法找到它? – peter

+0

我不確定我是否理解你在說什麼,也許RadComboBox不能像默認的sl 4組合框一樣工作?因爲主文本框中顯示的內容正是數據素材... – Leo

+0

如果IsComitable在組合框上設置爲true,那麼「文本框」中的文本不正確。否則你是對的,上面的模板工作。 – peter