如何将字典的 ObservableCollection 绑定到 DataGrid?

How do I bind an ObservableCollection of Dictionaries to DataGrid?

我正在尝试了解如何将 ObservableCollection<*Dictionary<string, DBRecord>> 绑定到 DataGridItemSource 属性。

下面你可以看到 类 代表我的数据库 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。

我的想法是:

这是我的 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 的评论,我似乎试图通过创建 DataTableDataColumnDataRow 和其他 类.

来重新发明轮子

我删除了我的 类 并且我的代码基于 System.Data 类 表格。

此外,DataTable 完美绑定到 DataGrid,它解决了我所有的问题。