如何将字典的 ObservableCollection 绑定到 DataGrid?
How do I bind an ObservableCollection of Dictionaries to DataGrid?
我正在尝试了解如何将 ObservableCollection<*Dictionary<string, DBRecord>>
绑定到 DataGrid
的 ItemSource
属性。
下面你可以看到 类 代表我的数据库 table 在内存中。我需要这样做,因为 table 模式是在一个独立的 .xml 文件中描述的(我无法更改它)。
public abstract class DBField {
public string Name;
public DBField(string name) {
Name = name;
}
}
public class DBValueField<T> : DBField {
public T Value;
public DBValueField(string name, T value) : base(name) {
Value = value;
}
}
public class DBTextField : DBValueField<string> {
public DBTextField(string name, string value) : base(name, value) { }
}
public class DBIntField : DBValueField<int> {
public DBIntField(string name, int value) : base(name, value)
{}
}
public class DBFloatField : DBValueField<float> {
public DBFloatField(string name, float value) : base(name, value)
{}
}
public class DBDoubleField : DBValueField<double> {
public DBDoubleField(string name, double value) : base(name, value)
{}
}
public class DBBoolField : DBValueField<bool> {
public DBBoolField(string name, bool value) : base(name, value)
{}
}
public class DBRecord {
public Dictionary<string, DBField> Fields { get; set; }
}
public class DBTable {
private readonly XmlSchema schema;
public List<DBRecord> Records { get; set; }
}
这是我的数据库视图模型:
public class DatabaseViewModel : BaseViewModel {
public Dictionary<string, DBTable> Tables { get; private set; }
public DBTable ActiveTable { get; private set; }
public ObservableCollection<DBRecord> ActiveData { get; set; }
}
我有一个 ComboBox,其中包含所有已加载数据库 table 的完整列表,并且我有一个 DataGrid 元素在那个 ComboBox 下。这个想法是,当您 select 一个特定的 table 时,ViewModel 将使用列(从 table 模式检索)和值(值分配给 ActiveData 作为参考并从 ComboBox 中的 selected table 检索)。
问题是我不明白如何将这样的结构正确绑定到 DataGrid。
我的想法是:
- 知道如何访问数据的转换器
- 将数据映射到每个 table 的自定义 类(我真的很想避免,因为不知道需要什么 table)
- 以某种方式将字典集合绑定到 DataGrid(尝试这样做但不太了解如何做)
- 如何通过代码隐藏在 DataGrid 中手动插入行?
这是我的 WPF 标记:
<ComboBox x:Name="tablesComboBox"
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="8"
Style="{StaticResource DarkFlatComboBox}"
ItemsSource="{Binding Tables, Mode=OneWay}"
DisplayMemberPath="Key"
SelectedValuePath="Value"
SelectionChanged="ComboBox_SelectionChanged"/>
<DataGrid x:Name="dataGrid"
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="8"
AutoGenerateColumns="True"
LoadingRow="DataGrid_LoadingRow"
Style="{StaticResource DarkDataGrid}"
ItemsSource="{Binding ActiveTable.Records,
Mode=TwoWay}"/>
根据 BionicCode 的评论,我似乎试图通过创建 DataTable
、DataColumn
、DataRow
和其他 类.
来重新发明轮子
我删除了我的 类 并且我的代码基于 System.Data 类 表格。
此外,DataTable
完美绑定到 DataGrid
,它解决了我所有的问题。
我正在尝试了解如何将 ObservableCollection<*Dictionary<string, DBRecord>>
绑定到 DataGrid
的 ItemSource
属性。
下面你可以看到 类 代表我的数据库 table 在内存中。我需要这样做,因为 table 模式是在一个独立的 .xml 文件中描述的(我无法更改它)。
public abstract class DBField {
public string Name;
public DBField(string name) {
Name = name;
}
}
public class DBValueField<T> : DBField {
public T Value;
public DBValueField(string name, T value) : base(name) {
Value = value;
}
}
public class DBTextField : DBValueField<string> {
public DBTextField(string name, string value) : base(name, value) { }
}
public class DBIntField : DBValueField<int> {
public DBIntField(string name, int value) : base(name, value)
{}
}
public class DBFloatField : DBValueField<float> {
public DBFloatField(string name, float value) : base(name, value)
{}
}
public class DBDoubleField : DBValueField<double> {
public DBDoubleField(string name, double value) : base(name, value)
{}
}
public class DBBoolField : DBValueField<bool> {
public DBBoolField(string name, bool value) : base(name, value)
{}
}
public class DBRecord {
public Dictionary<string, DBField> Fields { get; set; }
}
public class DBTable {
private readonly XmlSchema schema;
public List<DBRecord> Records { get; set; }
}
这是我的数据库视图模型:
public class DatabaseViewModel : BaseViewModel {
public Dictionary<string, DBTable> Tables { get; private set; }
public DBTable ActiveTable { get; private set; }
public ObservableCollection<DBRecord> ActiveData { get; set; }
}
我有一个 ComboBox,其中包含所有已加载数据库 table 的完整列表,并且我有一个 DataGrid 元素在那个 ComboBox 下。这个想法是,当您 select 一个特定的 table 时,ViewModel 将使用列(从 table 模式检索)和值(值分配给 ActiveData 作为参考并从 ComboBox 中的 selected table 检索)。 问题是我不明白如何将这样的结构正确绑定到 DataGrid。
我的想法是:
- 知道如何访问数据的转换器
- 将数据映射到每个 table 的自定义 类(我真的很想避免,因为不知道需要什么 table)
- 以某种方式将字典集合绑定到 DataGrid(尝试这样做但不太了解如何做)
- 如何通过代码隐藏在 DataGrid 中手动插入行?
这是我的 WPF 标记:
<ComboBox x:Name="tablesComboBox"
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="8"
Style="{StaticResource DarkFlatComboBox}"
ItemsSource="{Binding Tables, Mode=OneWay}"
DisplayMemberPath="Key"
SelectedValuePath="Value"
SelectionChanged="ComboBox_SelectionChanged"/>
<DataGrid x:Name="dataGrid"
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="8"
AutoGenerateColumns="True"
LoadingRow="DataGrid_LoadingRow"
Style="{StaticResource DarkDataGrid}"
ItemsSource="{Binding ActiveTable.Records,
Mode=TwoWay}"/>
根据 BionicCode 的评论,我似乎试图通过创建 DataTable
、DataColumn
、DataRow
和其他 类.
我删除了我的 类 并且我的代码基于 System.Data 类 表格。
此外,DataTable
完美绑定到 DataGrid
,它解决了我所有的问题。