【问题标题】:WPF: ComboBox displays "(namespace).(classname)" instead of dataWPF:组合框显示“(命名空间)。(类名)”而不是数据
【发布时间】:2009-02-02 15:02:38
【问题描述】:

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

目前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>

【问题讨论】:

标签: wpf xaml data-binding combobox


【解决方案1】:

您可以覆盖ContactToString 方法,也可以在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 资源中。

【讨论】:

  • 哇,我将不得不让它沉入其中,ComboBoxItem 内有一个 StackPanel。所以发布的答案代码在上面有效,但我没有看到我的 ComboBox 和 DataTemplate 之间的连接,我希望 DataTemplate 有一个名称,并且 ComboBox 引用它。
  • 组合框显示联系人对象。因此 WPF 在可视化树中搜索显示联系人的 DataTemplate,并使用该模板。如果没有模板,则默认使用 ToString。除了通过 Contact 对象外,没有直接的联系。
  • 这就是 WPF 的美妙之处。您定义了一种显示数据对象的方式,然后无论该对象出现在哪里,模板都会用于显示它。
  • 另外,stackpanel 只是为了获得“firstname”+“lastname”的外观。您可以使用 Binding 转换器做同样的事情,但这样做更容易。
  • 在解决此类问题时,自动完成功能将不起作用。看看拉法的回答。
【解决方案2】:

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

TextSearch.TextPath ="Title"

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

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

【讨论】:

  • 我知道它是像TextSearch.TextPath 这样的属性,但是男孩很难在那些建议ToStrings 和DisplayMemberPaths 的人中找到正确的答案...谢谢!
【解决方案3】:

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

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

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

【讨论】:

  • 这很好,但我可能有其他控件想要以不同方式覆盖,据我所知,我只有一个覆盖。
【解决方案4】:

您需要使用 DisplayMember="TheValue"

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

HTH, 埃里克,

【讨论】:

  • 是的,这会起作用,但我希望能够格式化文本而不是组合框项目,例如姓氏 + " " + 名字
  • 嗨,爱德华,抱歉花了我这么长时间。你有几种方法来解决这个问题。 1) 添加返回 this.lastname + ", " + this.firstname 的属性 FullName。并将其用作 dedisplay 成员。 HH,埃里克
  • 2) 使用 IValueConverter 转换显示的值,您可以将其用作 XAML 中的静态资源并添加 Converter XML 属性。
猜你喜欢
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
相关资源
最近更新 更多