2009-02-02 51 views
8

我想讓我的ComboBox在XAML中綁定到我的List代碼後面的自定義對象集合。WPF:ComboBox顯示「(namespace)。(classname)」而不是數據

當前ComboBox列出了每個條目dpwpf.Contact這是我的{namespace}.{classname}

我需要在XAML中放置什麼來告訴它列出來,例如:姓氏+名字?

我知道這是類似{Binding Path=... Value=...}但我無法得到它。

XAML:

<Window x:Class="dpwpf.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <StackPanel> 
      <TextBlock Text="Select the contact:"/> 
      <ComboBox Name="theContactList"/> 
     </StackPanel> 
    </StackPanel> 
</Window> 

代碼背後:

namespace dpwpf 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      StoreDB db = new StoreDB(); 
      List<Contact> contacts = db.GetContacts() 
      theContactList.ItemsSource = contacts.ToList(); 
     } 
    } 
} 

答:

<Window x:Class="dpwpf.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
    xmlns:local="clr-namespace:dpwpf"> 

    <Window.Resources> 
     <DataTemplate DataType="{x:Type local:Contact}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding LastName}"/> 
       <TextBlock Text=" "/> 
       <TextBlock Text="{Binding FirstName}"/> 
      </StackPanel> 
     </DataTemplate> 
    </Window.Resources> 

    <StackPanel> 
     <StackPanel Margin="10"> 
      <TextBlock Text="Contact Name:" Foreground="#555"/> 
      <TextBox Name="theName"/> 
     </StackPanel> 
     <StackPanel> 
      <TextBlock Text="Select the contact:"/> 
      <ComboBox Name="theContactList"/> 
     </StackPanel> 
    </StackPanel> 
</Window> 
+0

的[WPF IsEditable =填充對象真正組合框顯示的ToString()作爲所選擇的項目]可能的複製(https://stackoverflow.com/questions/1844156/wpf- iseditable-true-combobox-filled-with-objects-displays-the-tostring-as-the) – 2017-10-26 09:48:39

回答

7

可以重寫ToString方法Contact,也可以定義在WPF中DataTemplate

xmlns:dpwpf="... namespace of dpwpf" 

<Window.Resources> 
    <DataTemplate DataType="{x:Type dpwpf:Contact}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding LastName}"> 
      <TextBlock Text=" "> 
      <TextBlock Text="{Binding FirstName}"> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

這允許您定義Contact對象將如何出現在窗口的任何位置。如果您想將其限制爲ComboBox,則可以將DataTemplate僅添加到ComboBox資源。

又見What does "{Binding}" mean?由BEA Stollnitz

2

你需要使用DisplayMember = 「TheValue」

您可以在添加此XAML或在CLR 也注意到您在cose中的綁定,而不是通過XAML。 我認爲這涉及到你的一個前期問題。 它實現通過ObjectDataProvider的 結合使用例如和在XAML

HTH, 埃裏克添加DisplayMemeber =「memeber」,

+0

是的,這將起作用,但我希望能夠格式化文本而不是組合框項目,例如姓氏+「」+名字 – 2009-02-02 15:33:13

+0

嗨,愛德華,對不起,我花了這麼長時間。 你有幾種方法來解決這個問題。 1)添加一個屬性FullName,返回this.lastname +「,」+ this.firstname。並將其用作顯示成員。 HH, Eric – user61477 2009-02-02 17:42:27

+0

2)使用IValueConverter轉換顯示的值,可以在XAML中用作靜態資源並添加Converter XML屬性。 – user61477 2009-02-02 17:43:05

4

什麼捆紮機構正在做的是呼籲類型的ToString(),該正在被綁定。因爲我猜你不是覆蓋ToString(),它只是這樣命名空間類型,而不是有用的東西。

正如反叛所言,您可以使用DisplayMember來指示綁定使用該名稱的屬性作爲顯示值,或者您可以覆蓋ToString()以獲取您的自定義屬性以顯示。

public void Contact 
{ 
public string FirstName { get; set; } 
public override string ToString() 
{ 
    return FirstName; 
} 
} 
+1

這很好,但我可能有其他控件要重寫不同,據我所知,我只得到一個覆蓋。 – 2009-02-02 15:33:47