अद्यतन 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
स्रोत
2010-10-22 12:09:29
धन्यवाद! WPF में सब कुछ के रूप में, ... कुछ भी संभव है, लेकिन कभी-कभी XAML में कई पंक्तियां होती हैं :) – Marek
क्या आपने [यह विधि] देखी है (http://stackoverflow.com/a/8279344/546730)? –
चयनित विकल्प ठीक से नहीं दिखाया गया है। इसके बजाय पूरी तरह से योग्य वर्ग संपत्ति का नाम दिखाया गया है (नए समाधान के अनुसार) –