WPF DataGridComboBoxColumn 如果不在 ItemsSource 中,则不显示文本

本文关键字:显示 文本 DataGridComboBoxColumn 如果不 ItemsSource WPF | 更新日期: 2023-09-27 18:28:29

在我的 C# WPF 应用程序中,我以编程方式将 ComboBoxColumn 添加到 DataGrid:

public static DataGridComboBoxColumn getCboCol(string colName, Binding textBinding)
{
    List<string> statusItemsList = new StatusStrList();
    DataGridComboBoxColumn cboColumn = new DataGridComboBoxColumn();
    cboColumn.Header = colName;
    cboColumn.SelectedItemBinding = textBinding;
    cboColumn.ItemsSource = statusItemsList;
    return cboColumn;
}

如果包含的数据网格中的项目包含我的StatusStrList不包含的文本,则不会显示该文本。

示例:如果我的StatusStrList包含A, B, C并且 DataGrid 的项具有X,则X不会在 ComboBox 中显示为文本。

我该如何解决这个问题?

提前感谢,基督教

WPF DataGridComboBoxColumn 如果不在 ItemsSource 中,则不显示文本

DataGridComboBoxColumn不够

动态,无法执行此类操作,但您可以使用DataGridTemplateColumn。下面的代码应该可以实现您需要的功能。它的工作原理是使用包含TextBlockCellTemplate,该可以轻松显示不在ComboBox ItemsSource中的项目。进入编辑模式将显示包含列表中所有项的ComboBox

        DataGridTemplateColumn cboColumn = new DataGridTemplateColumn();
        cboColumn.Header = colName;
        //DataTemplate for CellTemplate
        DataTemplate cellTemplate = new DataTemplate();
        FrameworkElementFactory txtBlkFactory = new FrameworkElementFactory(typeof(TextBlock));
        txtBlkFactory.SetValue(TextBlock.TextProperty, textBinding);
        cellTemplate.VisualTree = txtBlkFactory;
        cboColumn.CellTemplate = cellTemplate;
        //DataTemplate for CellEditingTemplate
        DataTemplate editTemplate = new DataTemplate();
        FrameworkElementFactory cboFactory = new FrameworkElementFactory(typeof(ComboBox));
        cboFactory.SetValue(ComboBox.TextProperty, textBinding);
        cboFactory.SetValue(ComboBox.ItemsSourceProperty, statusItemsList);
        cboFactory.SetValue(ComboBox.IsEditableProperty, true);
        MouseEventHandler handler = new MouseEventHandler(delegate(object sender, MouseEventArgs args)
        {
            ComboBox cboBox = (ComboBox)sender;
            cboBox.IsDropDownOpen = true;
        });
        cboFactory.AddHandler(ComboBox.MouseEnterEvent, handler);
        editTemplate.VisualTree = cboFactory;
        cboColumn.CellEditingTemplate = editTemplate;