【发布时间】:2020-12-10 06:15:53
【问题描述】:
我有一个奇怪的数据模型,我正在尝试在数据网格中生成动态列并正确绑定项目。
我有一个 Row 对象列表,我想绑定到 DataGrid 并使用简单的 DataGridTextColumn 显示。
<controls:DataGrid
Grid.Row="1"
x:Name="dataGrid"
ItemsSource="{x:Bind ViewModel.CurrentRows}"
我的目标是从第一行获取列列表并在设置绑定时构建我的网格列。我无法找出在 RowValue.value 处绑定数据的正确方法。
public TablePage()
{
InitializeComponent();
dataGrid.ItemsSource = ViewModel.CurrentRows;
foreach (Column column in ViewModel.CurrentRows.FirstOrDefault().Values.Select(x => x.key))
{
dataGrid.Columns.Add(new DataGridTextColumn()
{
Header = column.ColumnValidation.column_label,
Binding = new Binding() { Path = new PropertyPath("Values.value") }
});
}
}
在我的视图模型中,我有:
public ObservableCollection<Row> CurrentRows
Row 对象如下所示:
public class Row: INotifyPropertyChanged
{
public List<RowValue> Values { get; set; } = new List<RowValue>();
public event PropertyChangedEventHandler PropertyChanged;
}
最后一个 RowValue 对象如下所示:
public class RowValue: INotifyPropertyChanged
{
public Column key { get; set; }
public string value { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
}
列如下所示:
public class Column
{
public string name;
public ColumnValidation ColumnValidation;
}
ColumnValidation 如下所示:
public class ColumnValidation
{
public string column_label;
public DataTypeEnum data_type;
public int width;
public int decimal_places;
public int display_order;
public string calculation_formula;
public string edit_style;
public string default_value;
public decimal? minimum_value;
public decimal? maximum_value;
public bool is_column_nullable = false;
public bool inherit_values = false;
public bool display_column = false;
public bool is_editable = false;
public int column_style;
public string code_table_name;
public string code_display_name;
public string code_data_column_name;
}
【问题讨论】:
-
您好,嵌套集合结构可能不适合DataGrid中的简单绑定。您可能需要考虑提取
column_label并将其放在Row类中(您需要更改现有数据结构)。实际上,根据当前的绑定(ObservableCollection),只能显示Row级别的信息,绑定路径
Values.value不会生效。因为value是RowValue类的属性,而不是List<RowValue>的属性 -
我害怕那个。我认为我可以通过构建一个聪明的 DataTemplate 来解决它,但我想不会。
-
您好,您可以插入DataGrid的数据模板比较单一。对于
DataGridTextColumn等预设的Column模板,需要传入固定的绑定路径。如果你想使用DataGridTemplateColumn,虽然它的自定义性更强,但可能无法满足你自动生成列名的需求。
标签: c# xaml uwp binding itemsource