2013-09-28 119 views
26

努力學習如何將對象綁定到不同類型的控件。在這種情況下,我希望獲取對象中的示例數據以顯示在ComboBox中。該代碼運行,但出現了什麼而不是值(大衛,海倫,喬)是文字 「TheProtect.UserControls.Client」)WPF:如何綁定對象組合框

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; 
     } 
    } 
} 

回答

56

有幾種方法告訴給顯示什麼框架

1)使用的組合框DisplayMemberPath(這將顯示命名的屬性):

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

2)組合框設置ItemTemplate。這就好比#1中,只允許你定義一個模板來顯示,而不僅僅是一個屬性:

<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)添加ToString()覆蓋到源類。如果您始終想要爲給定的類顯示相同的字符串,這很有用。 (注意,默認ToString()只是類類型的名稱,這就是爲什麼你看到「TheProtect.UserControls.Client」。)

public class Client 
{ 
    // ... 

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

4)添加DataTemplate到XAML資源。這對於將給定的類類型與更復雜或風格化的模板關聯很有用。

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

    // ... 

</UserControl>  
+0

謝謝!明確的答案和它的工作正常! –

8

DisplayMemberPath中,給出要顯示在組合框中的屬性的名稱。在SelectedValuePath中,給出您想要選擇的屬性的名稱。當您執行ComboBox.SelectedValue時,您將獲得此屬性的值。