数据网格中的自定义单元格类

时间:2018-11-14 15:34:23

标签: c# wpf datagrid

我创建了一个矩阵控件,该控件派生自const base64string = 'data:image/png;base64,{bytes...}'.split(',')[1]; Tesseract.recognize(Buffer.from(base64string, 'base64')); ,该控件应该能够在单元格中显示复杂类型。这些复杂的类型应通过模板设置样式。

使用DataGrid时,AutoGenerateColumns将根据分配给DataGrid的列表类型自动创建列和单元格类型。

我想替换网格的行,列和单元格类型,以使用与其绑定的视图模型执行自定义操作和绑定。我已经能够创建自定义的行和列。有没有办法从ItemsSource派生数据并使数据网格使用该类型而不是默认类型?

我看了一下.net源代码,发现该行使用DataGridCell创建了单元格,但是该属性不可访问。

DataGridCellsPresenter

更新:尝试替换public class MatrixControl : DataGrid { public static readonly DependencyProperty COLUMN_HEADER_TEMPLATE_PROPERTY = DependencyProperty.Register(nameof(ColumnHeaderTemplate), typeof(DataTemplate), typeof(MatrixControl), new PropertyMetadata(default(object))); public DataTemplate ColumnHeaderTemplate { get { return (DataTemplate)GetValue(COLUMN_HEADER_TEMPLATE_PROPERTY); } set { SetValue(COLUMN_HEADER_TEMPLATE_PROPERTY, value); } } private MatrixViewModel ViewModel { get { return DataContext as MatrixViewModel; } } public MatrixControl() { DataContextChanged += OnDataContextChanged; SelectionMode = DataGridSelectionMode.Extended; SelectionUnit = DataGridSelectionUnit.CellOrRowHeader; AutoGenerateColumns = true; } private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { ItemsSource = ViewModel.Rows.Select(c => new Row(c, ViewModel)); } protected override void OnAutoGeneratingColumn(DataGridAutoGeneratingColumnEventArgs e) { e.Cancel = true; Columns.Clear(); foreach (var column in ViewModel.Columns) { Columns.Add(new MatrixColumn(column) { HeaderTemplate = ColumnHeaderTemplate }); } } } class MatrixColumn : DataGridTemplateColumn { public object Value { get; } public MatrixColumn(object value) { Value = value; } } class Row { public object Value { get; } public Row(object value) { Value = value; } } class MatrixViewModel { public IEnumerable<object> Columns { get; set; } public IEnumerable<object> Rows { get; set; } }

DataGridCellsPresenter

1 个答案:

答案 0 :(得分:0)

我已经找到解决此问题的方法post

到目前为止,该问题中的代码还不错,唯一需要做的就是覆盖xaml中的cmake模板。为了完整起见,我发布了另一个问题的xaml代码:

MatrixRow