使用默认元素的ComboBox的自定义控件

时间:2017-06-07 12:51:07

标签: wpf templates combobox styles

我想要的是什么: 我正在尝试创建一个具有默认'的ComboBox。元素与其他项目分开。

我有什么: 因此,通过跟踪关于对项目进行分组并覆盖ItemTemplate的无数线程,我得出了这个结果:

http://imgur.com/a/ztVWM

.CS

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new ObservableCollection<GroupItem>()
            {
                new GroupItem() { Name = "Default Item", GroupName = "Default"},
                new GroupItem() { Name = "Item 1", GroupName = "Item"},
                new GroupItem() { Name = "Item 2", GroupName = "Item"},
                new GroupItem() { Name = "Item 3", GroupName = "Item"}
            };
        }

        public class GroupItem
        {
            public string Name { get; set; }
            public string GroupName { get; set; }
        }
    }
}

XAML

<Window.Resources>
    <CollectionViewSource Source="{Binding}" x:Key="GroupedDataCollView">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="GroupName" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
    <DataTemplate x:Key="GroupHeaderTemplate">
        <TextBlock Text="{Binding GroupName}" Margin="10,0,0,0" Foreground="#989791" />
    </DataTemplate>
    <!--Here, we tell that the URL's description should be displayed as item text.-->
    <DataTemplate x:Key="NameTemplate">
        <TextBlock Text="{Binding Name}" Margin="10,0,0,0"/>
    </DataTemplate>

    <Style x:Key="GroupStyleContainerStyle" TargetType="{x:Type GroupItem}" >
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <StackPanel>
                        <Separator />
                        <ItemsPresenter />
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


</Window.Resources>
<Window>
<!-- ... -->
    <ComboBox Grid.Row="1" Grid.Column="1" 
              ItemsSource="{Binding Source={StaticResource GroupedDataCollView}}"
              Width="200" Margin="10">
        <ComboBox.GroupStyle>
            <GroupStyle 
                ContainerStyle="{StaticResource GroupStyleContainerStyle}"
                HeaderTemplate="{StaticResource GroupHeaderTemplate}" />
        </ComboBox.GroupStyle>
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
<!-- ... -->
</Window>

问题:由于我们将字典用于另一个项目中的样式和模板,因此我无法使用此解决方案&#39;因为这需要风格来了解他所期望的项目类型(破坏自定义样式和模板的隔离)。此外,我并不是一个真正想要创造的群体而是一个特殊的群体。项目,由其他人在视觉上分开。

所以我尝试创建一个自定义的UserControl来解决问题所以我可以像这样使用它:

<ComboBox ItemsSource="{Binding Items}" DefaultItem="{Binding DefaultItem}" SelectedItem="{Binding SelectedItem}" />

在这个CustomControl中,我将创建对用户隐藏的必要分组和处理。但是我怎么能这样做呢?我怎么能覆盖整个选择行为,因为我不想返回一个键值对(GroupItem)而不是用户期望的项目。

简而言之:如何创建一个CustomControl,它提供了开头所示的必要功能以及上面显示的简单性?

0 个答案:

没有答案