2013-09-28 6 views
26

पर ऑब्जेक्ट को बाध्य करने के लिए विभिन्न प्रकार के नियंत्रणों को ऑब्जेक्ट्स को बाध्य करने का तरीका जानने का प्रयास करें। इस उदाहरण में, मैं कॉम्बोबॉक्स में दिखाई देने के लिए अपने ऑब्जेक्ट में नमूना डेटा प्राप्त करना चाहता हूं। (UcDataBindingObject.xaml)WPF: कॉम्बोबॉक्स

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

सी #: ucDataBindingObject.xaml कोड रन लेकिन क्या मूल्यों (डेविड, हेलेन, जो) के बजाय प्रकट होने वाले "TheProtect.UserControls.Client")

XAML है। सीएस

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

सी # 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) का प्रयोग करें ComboBox पर DisplayMemberPath (इस संपत्ति नामित प्रदर्शित करेगा):

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

2) ComboBox पर 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 करते हैं, तो आपको इस संपत्ति का मूल्य प्राप्त होगा।

संबंधित मुद्दे