using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using static Ramitta.winDataGrid; namespace Ramitta { public partial class winDataGrid : UserControl { public ObservableCollection< Dictionary?> > Rows { get; private set; } public Dictionary Columns=new(); public winDataGrid() { InitializeComponent(); Rows = new(); xDataGrid.ItemsSource = Rows; } // 定义列类型的枚举 public enum ColumnType { Button, CheckBox, ComboBox, TextBox, Label } public void AddColumn(string columnName, ColumnType columnType) { DataTemplate dataTemplate = new DataTemplate(); DataGridTemplateColumn column = new DataGridTemplateColumn(); FrameworkElementFactory? elementFactory=null; Columns.Add(columnName, columnType); switch (columnType) { case ColumnType.Button: elementFactory = new FrameworkElementFactory(typeof(Button)); elementFactory.SetBinding(Button.ContentProperty, new Binding($"[{columnName}][Content]") { Mode = BindingMode.TwoWay }); break; case ColumnType.CheckBox: elementFactory = new FrameworkElementFactory(typeof(CheckBox)); elementFactory.SetValue(CheckBox.IsCheckedProperty, new Binding($"[{columnName}][IsChecked]") { Mode = BindingMode.TwoWay }); break; case ColumnType.ComboBox: elementFactory = new FrameworkElementFactory(typeof(ComboBox)); elementFactory.SetValue(ComboBox.SelectedIndexProperty,0); elementFactory.SetValue(ComboBox.ItemsSourceProperty, new Binding($"[{columnName}][ItemsSource]") { Mode = BindingMode.TwoWay }); elementFactory.SetValue(ComboBox.SelectedValueProperty, new Binding($"[{columnName}][SelectedValue]") { Mode = BindingMode.TwoWay }); break; case ColumnType.Label: elementFactory = new FrameworkElementFactory(typeof(Label)); elementFactory.SetBinding(Label.ContentProperty, new Binding($"[{columnName}][Content]") { Mode = BindingMode.TwoWay }); break; case ColumnType.TextBox: elementFactory = new FrameworkElementFactory(typeof(TextBox)); elementFactory.SetBinding(TextBox.TextProperty, new Binding($"[{columnName}][Text]") { Mode = BindingMode.TwoWay }); break; } dataTemplate.VisualTree = elementFactory; column.Header = columnName; column.CellTemplate = dataTemplate; column.CellEditingTemplate = dataTemplate; xDataGrid.Columns.Add( column ); } public Dictionary?> AddRow(){ var keys = Columns.Keys.ToList(); var row = new Dictionary?> { }; foreach (var key in keys) { var value = new Dictionary { }; switch (Columns[key]) { case ColumnType.Button: value.Add("Content","value"); break; case ColumnType.CheckBox: value.Add("IsChecked", false); break; case ColumnType.ComboBox: value.Add("ItemsSource", null); value.Add("SelectedValue", null); break; case ColumnType.TextBox: value.Add("Text", "value"); break; case ColumnType.Label: value.Add("Content", "value"); break; } row.Add(key, value); } Rows.Add(row); return row; } } }