रे बर्न्स 'answer पर एलेक्सी Mitev की टिप्पणी मुझे प्रेरित निम्नलिखित यथोचित कम उपयोगिता वर्ग है, जो अब मैं अपने सभी WPF परियोजनाओं में उपयोग लिखने के लिए: पिटारे में इसी के साथ
public class ComboBoxItemTemplateSelector : DataTemplateSelector
{
public List<DataTemplate> SelectedItemTemplates { get; } = new List<DataTemplate>();
public List<DataTemplate> DropDownItemTemplates { get; } = new List<DataTemplate>();
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
return GetVisualParent<ComboBoxItem>(container) == null
? ChooseFrom(SelectedItemTemplates, item)
: ChooseFrom(DropDownItemTemplates, item);
}
private static DataTemplate ChooseFrom(IEnumerable<DataTemplate> templates, object item)
{
if (item == null)
return null;
var targetType = item.GetType();
return templates.FirstOrDefault(t => (t.DataType as Type) == targetType);
}
private static T GetVisualParent<T>(DependencyObject child) where T : Visual
{
while (child != null && !(child is T))
child = VisualTreeHelper.GetParent(child);
return child as T;
}
}
, यह लिखने के लिए संभव है XAML इस तरह:
<UserControl.Resources>
<DataTemplate x:Key="SelectedItemTemplateForInt" DataType="{x:Type system:Int32}">
<!-- ... -->
</DataTemplate>
<DataTemplate x:Key="SelectedItemTemplateForDouble" DataType="{x:Type system:Double}">
<!-- ... -->
</DataTemplate>
<DataTemplate x:Key="DropDownItemTemplateForInt" DataType="{x:Type system:Int32}">
<!-- ... -->
</DataTemplate>
<DataTemplate x:Key="DropDownItemTemplateForDouble" DataType="{x:Type system:Double}">
<!-- ... -->
</DataTemplate>
</UserControl.Resources>
<ComboBox>
<ComboBox.ItemTemplateSelector>
<local:ComboBoxItemTemplateSelector>
<local:ComboBoxItemTemplateSelector.SelectedItemTemplates>
<StaticResource ResourceKey="SelectedItemTemplateForInt" />
<StaticResource ResourceKey="SelectedItemTemplateForDouble" />
</local:ComboBoxItemTemplateSelector.SelectedItemTemplates>
<local:ComboBoxItemTemplateSelector.DropDownItemTemplates>
<StaticResource ResourceKey="DropDownItemTemplateForInt" />
<StaticResource ResourceKey="DropDownItemTemplateForDouble" />
</local:ComboBoxItemTemplateSelector.DropDownItemTemplates>
</local:ComboBoxItemTemplateSelector>
</ComboBox.ItemTemplateSelector>
</ComboBox>
यह आपके उपयोगकर्ताओं को भ्रमित करने के लिए चाटना है, लोगों को एक कंस्ट्रो बॉक्स को एक कंस्ट्रो बॉक्स के रूप में व्यवहार करने की उम्मीद है। –
वैसे यह चेकबॉक्स के साथ एक कॉम्बोबॉक्स है जो असामान्य हो सकता है, लेकिन मैं यह नहीं कहूंगा कि यह बहुत भ्रमित (या बुराई) है। एक अतिरिक्त पॉपअप विंडो का उपयोग करना ओवरकिल की तरह लगता है, और यह तत्व पूर्ण आकार की चेकबॉक्स सूची होने के लिए पर्याप्त महत्वपूर्ण नहीं है। –
स्पष्ट रूप से मैं एक चयनित आइटम नहीं दिखा सकता क्योंकि मेरे पास एक भी चयनित आइटम नहीं है। –