带标题的WPF多列组合框

本文关键字:组合 WPF 标题 | 更新日期: 2023-09-27 18:22:20

我对WPF中的组合框有一个相当直接的需求。

我需要一个绑定到ViewModel的具有标头的组合框。我发现了许多关于这个主题的其他问题和答案,但似乎没有一个符合我的确切要求。

给定以下(ninject)属性:

  public List<OrderBatchVm> OrderBatches
  {
     get
     {
        return _orderBatches;
     }
     private set
     {
        Set(() => OrderBatches, ref _orderBatches, value);
     }
  }

这个ViewModel

public class OrderBatchVm
{                                                                                                                           
   public string Name { get; set; }
   public DateTime Time { get; set; }
   public string User { get; set; }
}

我从各种其他堆栈溢出问题中得出了以下内容

<ComboBox  Width="400" Height="22" ItemsSource="{DynamicResource items}"   VerticalAlignment="Center" >
    <ComboBox.Resources>
        <CompositeCollection x:Key="items">
            <ComboBoxItem IsEnabled="False">
                <Grid TextElement.FontWeight="Bold" Width="400">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.Children>
                        <TextBlock Grid.Column="0" Text="Name"/>
                        <TextBlock Grid.Column="1" Text="User"/>
                        <TextBlock Grid.Column="2" Text="Date"/>
                    </Grid.Children>
                </Grid>
            </ComboBoxItem>
            <Separator/>
            <CollectionContainer Collection="{Binding OrderBatches}"/>
        </CompositeCollection>
        <DataTemplate DataType="viewModel:OrderBatchVm">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="A"/>
                    <ColumnDefinition Width="5"/>
                    <ColumnDefinition SharedSizeGroup="B"/>
                </Grid.ColumnDefinitions>
                <Grid.Children>
                    <TextBlock Grid.Column="0" Text="{Binding Name}"/>
                    <TextBlock Grid.Column="1" Text="{Binding User}"/>
                    <TextBlock Grid.Column="2" Text="{Binding Time}"/>
                </Grid.Children>
            </Grid>
        </DataTemplate>
    </ComboBox.Resources>
</ComboBox> 

上面生成了一个带有标头的ComboBox,但是数据没有绑定到CollectionContainer

在对这种方法进行了相当多的研究后,我想我理解了它本质上试图做什么,以及CollectionContainer的陷阱,尽管我不确定我试图实现的目标是否可能,或者如何实现

更新

以下内容确实有效,但它没有标题,这是我在这种情况下的主要要求:

<ComboBox  Width="400" Height="22" ItemsSource="{Binding OrderBatches}"   VerticalAlignment="Center" >
    <ComboBox.ItemTemplate>
        <DataTemplate DataType="viewModel:OrderBatchVm">
            <Grid  Width="400">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.Children>
                <TextBlock Grid.Column="0" Text="{Binding Name}"/>
                <TextBlock Grid.Column="1" Text="{Binding User}"/>
                <TextBlock Grid.Column="2" Text="{Binding Time}"/>
            </Grid.Children>
        </Grid>
    </DataTemplate>
        </ComboBox.ItemTemplate>
</ComboBox> 

带标题的WPF多列组合框

您的第一种方法不会显示集合,因为您的DataContext似乎设置不正确。另一方面,如果设置正确,则不会看到标头,因为ComboBoxItem是在xaml中设置的,不属于ItemsSource。您可以使用视图模型数据(ItemsSource)或Xaml定义的ComboBoxItems的修复列表,而不是两者都使用。在您的情况下,我认为您希望连接到ItemsSource。

1)

我已经使用类似MSDN示例的Controltemplate在下拉列表中显示了标题(此处)

只需将标题模板放置在"弹出"定义中,ScrollViewer上方(因为您不希望标题滚动!)

2) 你也可以保持你的方法2,简单地根据你的需求增强你的ItemTemplate(例如,你的视图模型规则是:第一个集合始终是标题)。