2009-09-22 77 views
40

好吧,我看了其他問題,似乎沒有得到我的答案,所以希望有人在這裏可以。WPF Combobox DisplayMemberPath

非常簡單的問題爲什麼DisplayMemberPath屬性不綁定到該項目?

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" DisplayMemberPath="{Binding Name}" SelectedItem="{Binding Prompt}"/> 

跟蹤輸出顯示,它正試圖綁定到類保持了IEnumerable不是在IEnumerable的實際項目。我很困惑,以一種簡單的方式來填充組合框,而不用在xaml中添加一行。

它只是在itemssource中爲對象調用ToString()。我有一個工作周圍是這樣的:

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" SelectedItem="{Binding Prompt}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

但在我看來,這太過分了這樣一個簡單的任務。我可以使用relativesource綁定嗎?

回答

115

DisplayMemberPath指定每個項目的顯示字符串屬性的路徑。在你的情況下,你將它設置爲"Name",而不是"{Binding Name}"

+0

你絕對驚人,我不能相信我錯過了明顯的。 – Jose 2009-09-22 15:02:41

+0

很高興幫助! (有些填充符合SO) – 2009-09-22 15:06:33

+0

這裏同樣的問題。謝謝你 - 所以再次拯救! – 2010-08-26 16:50:59

7

您沒有綁定到類中的數據,而是告訴它從由成員「name」命名的類成員獲取數據,因此,如果您的實例有item.Name == "steve"它正在嘗試獲取數據從item.steve

爲此,您應該從MemberPath中刪除綁定。將其更改爲MemberPath = "Name"這表明它從成員「名稱」獲取數據。這樣,它會撥打item.Name,而不是item.steve

5

您應該將MemberPath="{Binding Name}"更改爲MemberPath="Name"。然後它會工作。

5

您可以刪除DisplayMemberPath,然後在TextBlock中設置路徑。
當您沒有ItemTemplate時,DisplayMemberPath是真正的。
或者你可以刪除你的ItemTemplate並使用DisplayMemberPath - 在這種情況下,它基本上爲你創建一個TextBlock。 不推薦你做兩個。

<TextBlock text="{Binding Path=Name, Mode=OneWay}" 
2

或者,您不需要設置DisplayMemberPath。你可以在PromptList中的對象中包含一個覆蓋ToString()。像這樣:

class Prompt { 
    public string Name = ""; 
    public string Value = ""; 

    public override string ToString() { 
     return Name; 
    } 
} 

了toString()會自動調用並顯示你的類名稱參數。這適用於ComboBoxes,ListBoxes等。

+5

這不是一個好的解決方案。 ToString()只是默認和回退策略,並不是將信息傳遞給GUI的標準。 – 2015-03-30 12:13:12