2010-10-22 24 views
9

मेरे पास लंबे विवरण वाले आइटमों की एक सूची के लिए एक WPF combobox है।डब्ल्यूपीएफ कॉम्बोबॉक्स में ड्रॉपडाउन सूची मान/चयनित आइटम के लिए एक अलग मूल्य कैसे प्रदर्शित करें?

कॉम्बोबॉक्स के लिए बाध्य प्रकार दोनों गुणों के रूप में संक्षिप्त और लंबा विवरण दोनों हैं। वर्तमान में, मैं पूर्ण विवरण के लिए बाध्यकारी हूँ।

comboBox.DisplayMemberPath = "FullDescription"; 

कैसे सुनिश्चित करने के लिए कि जब आइटम का चयन किया और बता गया में एक भी आइटम के रूप में प्रदर्शित किया जाता है, यह है, जबकि लटकती FullDescription प्रदर्शित करेगा ShortDescription संपत्ति का एक मूल्य के रूप में प्रदर्शित किया जाएगा?

उत्तर

16

अद्यतन 2011-11-14

मैं हाल ही में फिर से वही आवश्यकता पर आया था और मैं समाधान मैं नीचे पोस्ट के साथ बहुत खुश नहीं था। ComboBoxItem को फिर से टेम्पलेट किए बिना समान व्यवहार प्राप्त करने का एक अच्छा तरीका यहां दिया गया है। यह एक DataTemplateSelector

पहले का उपयोग करता है, नियमित रूप से DataTemplate, लटकती DataTemplate और ComboBox के लिए संसाधनों में ComboBoxItemTemplateSelector निर्दिष्ट करें। तब ItemTemplateSelector

<ComboBox ... 
      ItemTemplateSelector="{DynamicResource itemTemplateSelector}"> 
    <ComboBox.Resources> 
     <DataTemplate x:Key="selectedTemplate"> 
      <TextBlock Text="{Binding Path=ShortDescription}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="dropDownTemplate"> 
      <TextBlock Text="{Binding Path=FullDescription}"/> 
     </DataTemplate> 
     <local:ComboBoxItemTemplateSelector 
      x:Key="itemTemplateSelector" 
      SelectedTemplate="{StaticResource selectedTemplate}" 
      DropDownTemplate="{StaticResource dropDownTemplate}"/> 
    </ComboBox.Resources> 
</ComboBox> 

ComboBoxItemTemplateSelector जांच के लिए एक DynamicResource रूप ComboBoxItemTemplateSelector संदर्भ यदि कंटेनर एक ComboBoxItem का बच्चा है, अगर ऐसा है, तो हम एक ड्रॉपडाउन आइटम के साथ काम कर रहे हैं, अन्यथा यह ComboBox में आइटम है।

public class ComboBoxItemTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate DropDownTemplate 
    { 
     get; 
     set; 
    } 
    public DataTemplate SelectedTemplate 
    { 
     get; 
     set; 
    } 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     ComboBoxItem comboBoxItem = VisualTreeHelpers.GetVisualParent<ComboBoxItem>(container); 
     if (comboBoxItem != null) 
     { 
      return DropDownTemplate; 
     } 
     return SelectedTemplate; 
    } 
} 

GetVisualParent

public static T GetVisualParent<T>(object childObject) where T : Visual 
{ 
    DependencyObject child = childObject as DependencyObject; 
    while ((child != null) && !(child is T)) 
    { 
     child = VisualTreeHelper.GetParent(child); 
    } 
    return child as T; 
} 

पुरानी समाधान की आवश्यकता है ComboBoxItem

<SolidColorBrush x:Key="SelectedBackgroundBrush" Color="#DDD" /> 
<SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" /> 

<ControlTemplate x:Key="FullDescriptionTemplate" TargetType="ComboBoxItem"> 
    <Border Name="Border" Padding="2" SnapsToDevicePixels="true"> 
     <StackPanel> 
      <TextBlock Text="{Binding Path=FullDescription}"/> 
     </StackPanel> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsHighlighted" Value="true"> 
      <Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

<ComboBox Name="c_comboBox" ItemsSource="{Binding}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=ShortDescription}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <Setter Property="Template" Value="{StaticResource FullDescriptionTemplate}" /> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

यह निम्न व्यवहार में परिणाम की फिर से templating

alt text

+0

धन्यवाद! WPF में सब कुछ के रूप में, ... कुछ भी संभव है, लेकिन कभी-कभी XAML में कई पंक्तियां होती हैं :) – Marek

+2

क्या आपने [यह विधि] देखी है (http://stackoverflow.com/a/8279344/546730)? –

+0

चयनित विकल्प ठीक से नहीं दिखाया गया है। इसके बजाय पूरी तरह से योग्य वर्ग संपत्ति का नाम दिखाया गया है (नए समाधान के अनुसार) –

0

मुझे मिला एक और विकल्प combobox टेक्स्ट क्षेत्र पर एक टेक्स्टबॉक्स रखना है। आकार और संरेखित इतना है कि यह पूरी तरह से देता है पर इसे फिर इस के लिए एक उप समान का उपयोग करें:

Private Sub ComboBox*_Change() 
Dim T As String 
T = Left(ComboBox*.Text, 1) 
TextBox*.Value = T 
End Sub 

(की जगह प्रासंगिक संख्या के साथ *) नतीजा यह है कि जब चयनित लटकती हमेशा की तरह सूची प्रदर्शित करेगा है लेकिन उस पर झूठ बोलने वाला टेक्स्टबॉक्स केवल अपना पहला चरित्र दिखाएगा।

उम्मीद है कि इससे मदद मिलती है।

2

यह मेरे लिए अब काम करने के लिए लग रहे हैं नहीं है, लेकिन यह एक करता है:

public class ComboBoxItemTemplateSelector : DataTemplateSelector { 
    public DataTemplate SelectedTemplate { get; set; } 
    public DataTemplate DropDownTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) { 
    var presenter = (ContentPresenter)container; 
    return (presenter.TemplatedParent is ComboBox) ? SelectedTemplate : DropDownTemplate; 
    } 
} 
संबंधित मुद्दे