带标题的WPF MultiColumn ComboBox

时间:2014-09-18 22:07:59

标签: c# wpf mvvm combobox

我(似乎是)对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> 

1 个答案:

答案 0 :(得分:0)

由于您的DataContext似乎设置不正确,因此您的第一种方法不会显示该集合。 另一方面,如果设置正确,您将看不到标题,因为ComboBoxItem是在xaml中设置的,不属于ItemsSource。 您可以使用viewmodel数据(ItemsSource)或Xaml定义的ComboBoxItems的修复列表,而不是两者。 在您的情况下,我认为您想要连接到ItemsSource。

1)

我已经使用类似于MSDN示例(here)的Controltemplate在下拉列表中显示了一个标题。:

只需将标题模板放在ScrollViewer上方的&#39; Popup&#39; - 定义中(因为您不希望标题滚动!)

2)你也可以管理它来保持你的方法2,只需根据你的需要增强你的ItemTemplate(例如你的viewmodel规则是:第一个collectionitem总是标题)。