WPF:ComboBox显示"(namespace).(classname)"而不是数据

Edw*_*uay 9 data-binding wpf xaml combobox

我想让我ComboBox的XAML绑定到我List后面的代码中的自定义对象集合.

目前ComboBox每个条目的列表dpwpf.Contact都是我的{namespace}.{classname}.

我需要在XAML中输入什么来告诉它列出,例如LastName + FirstName?

我知道它是类似{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>
Run Code Online (Sandbox Code Playgroud)

代码背后:

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

            StoreDB db = new StoreDB();
            List<Contact> contacts = db.GetContacts()
            theContactList.ItemsSource = contacts.ToList();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

回答:

<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>
Run Code Online (Sandbox Code Playgroud)

Cam*_*and 8

您可以覆盖ToString方法Contact,也可以DataTemplate在WPF中定义.

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>
Run Code Online (Sandbox Code Playgroud)

这允许您定义Contact对象在窗口中的任何位置的显示方式.如果要将此限制为,则ComboBox可以将DataTemplatejust 添加到ComboBox资源中.


Ray*_*sen 6

绑定机制正在做的是对正在绑定的类型调用 ToString()。因为我猜你不会重写 ToString() ,所以它只会使用 namespace.type 而不是有用的东西。

正如叛逆所说,您可以使用 DisplayMember 告诉绑定使用该名称的属性作为显示值,或者您可以重写 ToString() 如下所示以显示您的自定义属性。

public void Contact
{
 public string FirstName { get; set; }
 public override string ToString()
 {
   return FirstName; 
 }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

只需在你的ComboBox标签中添加它(xaml代码)

TextSearch.TextPath ="Title"
Run Code Online (Sandbox Code Playgroud)

ToString() 修改会影响您将来需要的所有案例,我不建议您这样做.

请参阅该示例:http: //simplesample.site90.com/wpf_combobox.php