【问题标题】:WPF MultiColumn ComboBox with Header带有标题的 WPF 多列组合框
【发布时间】: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> 

【问题讨论】:

    标签: c# wpf mvvm combobox


    【解决方案1】:

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

    1)

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      相关资源
      最近更新 更多