WPF: ComboBox отображает «(пространство имен). (Имя класса)» вместо данных - PullRequest
9 голосов
/ 02 февраля 2009

Я хочу, чтобы мой ComboBox в XAML связывался с моей 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>

Ответы [ 4 ]

8 голосов
/ 02 февраля 2009

Вы можете переопределить метод 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>

Это позволяет вам определить, как объект Contact будет появляться в любом месте окна. Если вы хотите ограничить это ComboBox, вы можете добавить DataTemplate только к ComboBox ресурсам.

6 голосов
/ 27 августа 2010

Просто добавьте это в свой тег ComboBox (код xaml)

TextSearch.TextPath ="Title"

ToString() модификация затрагивает все будущие случаи, когда вам это нужно, я не рекомендую вам делать это.

Посмотрите на этот пример: http://simplesample.site90.com/wpf_combobox.php

4 голосов
/ 02 февраля 2009

То, что делает механизм привязки, вызывает ToString () для связываемого типа. Потому что я полагаю, что вы не переопределяете ToString (), так будет просто namespace.type вместо чего-то полезного.

Как говорит rebelious, вы можете использовать DisplayMember, чтобы указать привязке использовать свойство с таким именем для отображаемого значения, или вы можете переопределить ToString (), как показано ниже, для отображения вашего пользовательского свойства.

public void Contact
{
 public string FirstName { get; set; }
 public override string ToString()
 {
   return FirstName; 
 }
}
3 голосов
/ 02 февраля 2009

вам нужно использовать DisplayMember = "TheValue"

Вы можете добавить это в XAML или в CLR. также обратите внимание на вашу привязку в cose, а не через XAML. Я думаю, это относится к твоему очевидному вопросу. который реализует привязку через ObjectDataProvider используйте этот пример и добавьте DisplayMemeber = "memeber" в XAML

НТН, Эрик,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...