2013-09-28 13 views
26

Próbuję nauczyć się wiązania obiektów z różnymi typami elementów sterujących. W tym przypadku chcę uzyskać próbki danych w moim obiekcie, aby pojawiły się w ComboBox. Trasy kod, ale to, co pojawia się zamiast wartości (David, Helen Joe) jest tekst "TheProtect.UserControls.Client")WPF: Jak powiązać obiekt z ComboBox

XAML (ucDataBindingObject.xaml)

<UserControl x:Class="TheProject.UserControls.ucDataBindingObject" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      Width="Auto" 
      Height="Auto" 
      mc:Ignorable="d"> 

    <Grid Width="130" 
      Height="240" 
      Margin="0"> 

      <ComboBox Width="310" 
         HorizontalAlignment="Left" 
         VerticalAlignment="Top" 
         ItemsSource="{Binding Path=Clients}" /> 
    </Grid> 
</UserControl> 

C#: ucDataBindingObject.xaml. cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Controls; 
namespace TheProject.UserControls 
{ 
    public partial class ucDataBindingObject : UserControl 
    { 

     public List<Client> Clients { get; set; } 


     public ucDataBindingObject() 
     { 
      Clients = new List<Client>(); 
      Clients.Add(new Client(1, "David")); // sample data 
      Clients.Add(new Client(2, "Helen")); 
      Clients.Add(new Client(3, "Joe")); 


      InitializeComponent(); 
      this.DataContext = this; 
     } 
    } 

C# Client.cs

using System; 
using System.Linq; 

namespace TheProject.UserControls 
{ 
    public class Client 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 

     public Client(int id, string name) 
     { 
      this.ID = id; 
      this.Name = name; 
     } 
    } 
} 

Odpowiedz

56

Istnieje kilka sposobów, aby powiedzieć ramy co do wyświetlenia

1) Użyj DisplayMemberPath na ComboBox (to wyświetli nazwie właściwość):

<ComboBox ItemsSource="{Binding Path=Clients}" 
      DisplayMemberPath="Name" 
/> 

2) Ustaw ItemTemplate na ComboBox. To jest jak # 1, z wyjątkiem pozwala zdefiniować szablon do wyświetlenia, a nie tylko własności:

<ComboBox ItemsSource="{Binding Path=Clients}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <Border BorderBrush="Green" BorderThickness="1" Padding="5"> 
       <TextBlock Text="{Binding Path=Name,StringFormat='Name: {0}'}" /> 
      </Border> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

3) Dodaj ToString() override do klasy źródłowej. Przydatne, jeśli zawsze chcesz wyświetlać ten sam ciąg dla danej klasy. (Zauważ, że domyślna ToString() jest tylko nazwa typu klasy, dlatego widać „TheProtect.UserControls.Client”.)

public class Client 
{ 
    // ... 

    public override string ToString() 
    { 
     return string.Format("{0} ({1})", Name, ID); 
    } 
} 

4) Dodaj DataTemplate do zasobów XAML. Jest to przydatne do powiązania danego typu klasy z bardziej złożonym lub stylizowanym szablonem.

<UserControl xmlns:local="clr-namespace:TheProject.UserControls"> 
    <UserControl.Resources> 
     <DataTemplate DataType="local:Client"> 
      <TextBlock Text="{Binding Name}" /> 
     </DataTemplate> 
    </UserControl.Resources> 

    // ... 

</UserControl>  
+0

Dzięki! Wyczyść odpowiedź i działa dobrze! –

8

W DisplayMemberPath, podać nazwę właściwości, które chcesz pokazać w ComboBox. W polu SelectedValuePath podaj nazwę właściwości, którą chcesz wybrać. Gdy wykonasz ComboBox.SelectedValue, otrzymasz wartość tej właściwości.