在WinRT XAML中,我有一个显示一些复杂项目的ComboBox
。
是否可以声明并绑定两个不同的项目模板:1)“正常”选定项目(ComboBox已关闭)和2)当用户想要选择另一个项目(ComboBox已打开)时,弹出窗口中的列表?
我发现ItemTemplate
适用于两者,但如果用户想要选择其他项目,我想显示略有不同模板的项目。
答案 0 :(得分:5)
使用项目模板选择器。在Selector类中定义两个属性SelectedTemplate和DropDownTemplate。检查容器是否包含在ComboboxItem中。如果是,请选择DropDownTemplate。如果没有选择SelectedTemplate。
public class ComboBoxItemTemplateSelector : DataTemplateSelector
{
public DataTemplate SelectedTemplate { get; set; }
public DataTemplate DropDownTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
var comboBoxItem = container.GetVisualParent<ComboBoxItem>();
if (comboBoxItem == null)
{
return SelectedTemplate;
}
return DropDownTemplate;
}
}
public static class DependencyObjectExtensions
{
public static T GetVisualParent<T>(this DependencyObject child) where T : FrameworkElement
{
while ((child != null) && !(child is T))
{
child = VisualTreeHelper.GetParent(child);
}
return child as T;
}
}
XAML中的ComboBox,
<Page.Resources>
<local:ComboBoxItemTemplateSelector x:Key="selector">
<local:ComboBoxItemTemplateSelector.DropDownTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ID}"/>
<TextBlock Text="{Binding Name}" Margin="5 0 0 0"/>
</StackPanel>
</DataTemplate>
</local:ComboBoxItemTemplateSelector.DropDownTemplate>
<local:ComboBoxItemTemplateSelector.SelectedTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</local:ComboBoxItemTemplateSelector.SelectedTemplate>
</local:ComboBoxItemTemplateSelector>
</Page.Resources>
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<ComboBox x:Name="combo"
ItemTemplateSelector="{StaticResource selector}">
</ComboBox>
</Grid>