2013-09-28 31 views
26

Nesnelerin çeşitli denetimlere nasıl bağlanacağını öğrenmeye çalışın. Bu örnekte, nesnemde ComboBox'ta görünecek örnek verileri almak istiyorum. (UcDataBindingObject.xaml)WPF: Nesne ComboBox'a nasıl bağlanır

<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 kod çalışır ama ne yerine değerler (David, Helen, Joe) ait görünen metin "TheProtect.UserControls.Client")

XAML olduğunu. 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; 
     } 
    } 
} 

cevap

56

görüntülemek ne çerçevesini anlatmak için birkaç yolu vardır

1) this) adında özelliği gösterecektir ComboBox DisplayMemberPath (kullanın:

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

2) ComboBox ItemTemplate ayarlayın. Eğer bir şablon görüntülemek için tanımlamanızı sağlar dışında bu yerine sadece bir özelliği daha, 1. gibidir:

<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) kaynak sınıfına bir ToString() geçersiz kılma ekleyin. Her zaman belirli bir sınıf için aynı dizeyi görüntülemek istiyorsanız kullanışlıdır. (Varsayılan ToString() siz "TheProtect.UserControls.Client" görmenizin nedeni de, sadece sınıf türü adı olduğunu unutmayın.)

public class Client 
{ 
    // ... 

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

4) XAML kaynaklarına bir DataTemplate ekleyin. Bu, belirli bir sınıf türünü daha karmaşık veya stilize bir şablonla ilişkilendirmek için kullanışlıdır.

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

    // ... 

</UserControl>  
+0

Teşekkürler! Yanıtı temizle ve iyi çalışıyor! –

8

DisplayMemberPath olarak, combobox göstermek istediğiniz özelliğin adını verir. SelectedValuePath'da, seçmek istediğiniz mülkün adını verin. Bir ComboBox.SelectedValue yaptığınızda, bu özelliğin değerini alırsınız.

İlgili konular