10

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

目前ComboBox每个条目的列表dpwpf.Contact是 my {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>

代码背后:

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>
4

4 回答 4

9

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

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您可以将DataTemplatejust 添加到ComboBox资源中。

于 2009-02-02T15:18:38.493 回答
7

只需将其添加到您的 ComboBox 标记中(xaml 代码)

TextSearch.TextPath ="Title"

ToString()修改会影响您以后需要的所有情况,我不建议您这样做。

看那个例子: http ://simplesample.site90.com/wpf_combobox.php

于 2010-08-27T10:14:33.390 回答
4

绑定机制所做的是在被绑定的类型上调用 ToString()。因为我猜你没有覆盖 ToString() 它只是这样 namespace.type 而不是有用的东西。

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

public void Contact
{
 public string FirstName { get; set; }
 public override string ToString()
 {
   return FirstName; 
 }
}
于 2009-02-02T15:16:17.407 回答
3

你需要使用 DisplayMember="TheValue"

您可以在 XAML 或 CLR 中添加它,还请注意您的绑定,而不是通过 XAML。我认为这与您的前一个问题有关。通过 ObjectDataProvider 实现绑定使用该示例并在 XAML 中添加 DisplayMemeber="memeber"

HTH,埃里克,

于 2009-02-02T15:09:48.183 回答