2009-05-08 20 views
6

मुझे लगता है कि XML डेटा के आधार पर ComboBox के साथ एक UserControl है:WPF: ComboBox करने के लिए बाइंडिंग SelectedItem

<UserControl x:Class="xxxxxxxx.MyComboBox" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="myComboBoxControl"> 
<UserControl.Resources> 
    <DataTemplate x:Key="dataTemplateNode"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" MinWidth="20"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="Auto" MinWidth="20"/> 
      </Grid.ColumnDefinitions> 
      <Border Background="{Binding [email protected]}" Grid.Column="0"> 
       <Image Source="{Binding [email protected]}" 
         Width="16" 
         Height="16" 
         Margin="3" /> 
      </Border> 
      <Border Background="{Binding [email protected]}" Grid.Column="1"> 
       <TextBlock Foreground="{Binding [email protected]}" 
          Margin="3" 
          Text="{Binding [email protected]}" /> 
      </Border> 
      <Border Background="{Binding [email protected]}" Grid.Column="2"> 
       <TextBlock Foreground="{Binding [email protected]}" 
          Margin="3" 
          FontWeight="Bold" 
          Text="{Binding [email protected]}" /> 
      </Border> 
     </Grid> 
    </DataTemplate> 

    <XmlDataProvider x:Key="xmlNodeList" 
        Source="/data/Combo.xml" 
        XPath="/Root/Node"/> 
</UserControl.Resources> 

<ComboBox Name="myComboBox" 
      ItemsSource="{Binding Source={StaticResource xmlNodeList}}" 
      ItemTemplate="{StaticResource dataTemplateNode}" 
      HorizontalContentAlignment="Stretch" /></UserControl> 

MainForm.xaml में मैं एक पाठ बॉक्स है:

<Root> 
<Node Background="Yellow" Foreground="Cyan" Image="1.ico" Property="aaaa" Value="28" /> 
<Node Background="SlateBlue" Foreground="Black" Image="2.ico" Property="bbbb" Value="2.5" /> 
<Node Background="Teal" Foreground="Green" Image="3.ico" Property="cccc" Value="4.0" /> 
<Node Background="Yellow" Foreground="Red" Image="4.ico" Property="dddd" Value="0" /></Root> 

यहाँ UserControl XAML है कि मैं अपने UserControl SelectedItem से जुड़ना चाहता हूं।

<StackPanel Orientation="Horizontal"> 
<local:MyComboBox1 x:Name="comboBoxST" /> 
<TextBox x:Name="textBoxST"/></StackPanel> 

मुझे खुशी होगी कि अगर आप मुझे यह कैसे करेंगे, तो मुझे खुशी होगी।

अग्रिम धन्यवाद!

उत्तर

12

यह चाल यह है कि जब आपको एक्सएमएल से जुड़े आइटम कंट्रोल पर चयनित इटैम से जुड़ना होता है, तो चयनित आइटम स्वयं एक्सएमएलएलमेंट होता है, और आपको आवश्यक तत्व/विशेषता प्राप्त करने के लिए XPath का उपयोग करना होगा।

इस लक्ष्य को हासिल करने के लिए सबसे आसान तरीका है DataContext उपयोग करने के लिए है:

<TextBox x:Name=textBoxST 
    DataContext="{Binding ElementName=comboBoxST, Path=SelectedItem}" 
    Text="{Binding [email protected]}"/> 
+0

हैलो saldoukhov! प्रतिक्रिया के लिए धन्यवाद, लेकिन, दुर्भाग्यवश, आपका समाधान काम नहीं करता है :-(शायद हो सकता है कि मूल कॉम्बोबॉक्स के एक्सएमएल बाध्यकारी के कारण उपयोगकर्ता नियंत्रण में शामिल हो? – user83493

+0

सिल्वरलाइट 5 में मेरे लिए 'XPath' निर्दिष्ट किए बिना मेरे लिए काम किया, लक्ष्यित वस्तु के संपत्ति नाम के लिए बाध्यकारी द्वारा 'टेक्स्ट = {बाइंडिंग विवरण}'। – OmegaMan

1

जवाब ऊपर तैनात एक सूची बॉक्स प्रपत्र पर सीधे रखा के मामले के लिए था। UserControl और टेम्पलेट कॉम्बोबॉक्स के मामले में, मैं शुद्ध एक्सएमएल बाध्यकारी से बचूंगा - बहुत से कारक इसे तोड़ सकते हैं। इसके बजाय, एक निर्भरता संपत्ति बनाने के लिए इस कोड का उपयोग करें:

public MyComboBox() 
    { 
     InitializeComponent(); 
     myComboBox.SelectionChanged += MyComboBoxSelectionChanged; 
    } 

    void MyComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     SetValue(SelValueProperty, ((XmlElement)e.AddedItems[0]).Attributes["Value"].Value); 
    } 

    public static readonly DependencyProperty SelValueProperty = 
     DependencyProperty.Register("SelValue", typeof(string), typeof(MyComboBox), 
      new FrameworkPropertyMetadata("")); 

और बाध्यकारी तो सरल है:

<TextBox x:Name=textBoxST Text="{Binding ElementName=comboBoxST, Path=SelValue}"/> 
2

के लिए क्या इसके लायक है, मैं सेर्गेई के पहले दृष्टिकोण बेहतर प्राथमिकता दी। लेकिन, मेरा परिदृश्य में, मैं एक पाठ बॉक्स के बजाय एक लेबल था, लेकिन यह मेरे लिए काम किया:

<Label x:Name="labelST" Content="{Binding ElementName=comboBoxST, Path=SelectedValue}"/> 

Spaciba, सेर्गेई।

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