ComboBox中的不同项模板

时间:2013-05-21 09:17:36

标签: xaml windows-runtime winrt-xaml

在WinRT XAML中,我有一个显示一些复杂项目的ComboBox

是否可以声明并绑定两个不同的项目模板:1)“正常”选定项目(ComboBox已关闭)和2)当用户想要选择另一个项目(ComboBox已打开)时,弹出窗口中的列表?

我发现ItemTemplate适用于两者,但如果用户想要选择其他项目,我想显示略有不同模板的项目。

1 个答案:

答案 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>
相关问题