2009-02-02 59 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

相关问题