wpf DataGridComboBoxColumn中的“ComboBoxItem的内联集合”

krcsximq  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(160)

MSDN说:
若要填充下拉列表,请首先使用下列选项之一设置ComboBox的ItemsSource属性:

  • 静态资源。有关详细信息,请参阅StaticResource标记扩展。
  • x:静态代码实体。有关更多信息,请参见x:静态标记扩展。
  • ComboBoxItem类型的内联集合。

对于“ComboBoxItem类型的内联集合”,我想到了类似这样的东西:

<DataGrid>
  <DataGrid.Columns>
    <DataGridComboBoxColumn>
      <ComboBoxItem Content="None" Tag="0" />
      <ComboBoxItem Content="Few" Tag="1" />
      <ComboBoxItem Content="Some" Tag="2" />
      <ComboBoxItem Content="Enough" Tag="3" />
      <ComboBoxItem Content="Lots" Tag="4" />
      <ComboBoxItem Content="Too much" Tag="5" />
    </DataGridComboBoxColumn>
 </DataGrid.Columns>
</DataGrid>

我知道有另外一种方法可以填充DataGridComboBoxColumn,但是我对此很好奇,因为我在我的研究中没有发现任何关于它的东西......那么“ComboBoxItem类型的内联集合”是什么意思呢?

nwlls2ji

nwlls2ji1#

这里的关键是DataGridComboBoxColumn不是ComboBox,引用的文档片段不适用。
我认为,不能在列定义中添加ComboBoxItem元素的原因是,这会带来将它们多次添加到可视树的问题(在填充每个ComboBox时,这些项将被“重用”而不是克隆)。
据我所知,DataGridComboBoxColumn只是一个列定义,它公开了一些ComboBox属性,默认情况下显示为ComboBox。我的观点是,它没有DataGridTemplateColumn无法实现的额外功能。
这里有一个替代镜头,应该可以让你开始:

<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox>
                        <ComboBoxItem Content="None" Tag="0" />
                        <ComboBoxItem Content="Few" Tag="1" />
                        <ComboBoxItem Content="Some" Tag="2" />
                        <ComboBoxItem Content="Enough" Tag="3" />
                        <ComboBoxItem Content="Lots" Tag="4" />
                        <ComboBoxItem Content="Too much" Tag="5" />
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

与前面的场景相反,这次它起作用了,因为ComboBoxItem元素是在DataTemplate内部定义的,这意味着XAML处理器实际上将它们转换为FrameworkElementFactory对象,而FrameworkElementFactory对象又能够根据需要生成模板化的ComboBoxItem元素。

pbwdgjma

pbwdgjma2#

只需在ItemsSource中使用CompositeCollection即可。

<DataGrid>
    <DataGrid.Columns>
        <DataGridComboBoxColumn>
            <DataGridComboBoxColumn.ItemsSource>
                <CompositeCollection>
                    <ComboBoxItem Content="None" Tag="0" />
                    <ComboBoxItem Content="Few" Tag="1" />
                    <ComboBoxItem Content="Some" Tag="2" />
                    <ComboBoxItem Content="Enough" Tag="3" />
                    <ComboBoxItem Content="Lots" Tag="4" />
                    <ComboBoxItem Content="Too much" Tag="5" />
                </CompositeCollection>
            </DataGridComboBoxColumn.ItemsSource>
        </DataGridComboBoxColumn>
    </DataGrid.Columns>
</DataGrid>

相关问题