我(似乎是)对WPF中的组合框有一个相当直接的要求
我需要一个带有标题的ComboBox,它绑定到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>
答案 0 :(得分:0)
由于您的DataContext似乎设置不正确,因此您的第一种方法不会显示该集合。 另一方面,如果设置正确,您将看不到标题,因为ComboBoxItem是在xaml中设置的,不属于ItemsSource。 您可以使用viewmodel数据(ItemsSource)或Xaml定义的ComboBoxItems的修复列表,而不是两者。 在您的情况下,我认为您想要连接到ItemsSource。
1)
我已经使用类似于MSDN示例(here)的Controltemplate在下拉列表中显示了一个标题。:
只需将标题模板放在ScrollViewer上方的&#39; Popup&#39; - 定义中(因为您不希望标题滚动!)
2)你也可以管理它来保持你的方法2,只需根据你的需要增强你的ItemTemplate(例如你的viewmodel规则是:第一个collectionitem总是标题)。