【发布时间】:2014-09-18 22:07:58
【问题描述】:
我对 WPF 中的组合框有(似乎是)一个相当直接的要求。
我需要一个带有绑定到 ViewModel 的标题的 ComboBox。我发现了很多关于这个主题的其他问题和答案,但是它们似乎都不能满足我的确切要求。
给定以下(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>
【问题讨论】: