带标题的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>
您的第一种方法不会显示集合,因为您的DataContext似乎设置不正确。另一方面,如果设置正确,则不会看到标头,因为ComboBoxItem是在xaml中设置的,不属于ItemsSource。您可以使用视图模型数据(ItemsSource)或Xaml定义的ComboBoxItems的修复列表,而不是两者都使用。在您的情况下,我认为您希望连接到ItemsSource。
1)
我已经使用类似MSDN示例的Controltemplate在下拉列表中显示了标题(此处)
只需将标题模板放置在"弹出"定义中,ScrollViewer上方(因为您不希望标题滚动!)
2) 你也可以保持你的方法2,简单地根据你的需求增强你的ItemTemplate(例如,你的视图模型规则是:第一个集合始终是标题)。