簡體   English   中英

如何將 ObservableCollection 的字典綁定到 DataGrid?

[英]How do I bind an ObservableCollection of Dictionaries to DataGrid?

我試圖了解如何將ObservableCollection<*Dictionary<string, DBRecord>>綁定到DataGridItemSource屬性。

您可以在下面看到代表我在 memory 中的數據庫表的類。 我需要這樣做,因為表模式在standalone.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 ,其中包含所有加載的數據庫表的完整列表,並且我在該 ComboBox 下方有一個DataGrid元素。 這個想法是,當您 select 特定表時,ViewModel 將使用列(從表模式檢索)和值(值分配給ActiveData作為引用並從組合框中的選定表中檢索)填充 DataGrid。 問題是我不明白如何正確地將這樣的結構綁定到 DataGrid。

我的想法是:

  • 知道如何訪問數據的轉換器
  • 將數據映射到每個表的定制類(我真的想避免這種情況,因為不知道需要哪些表)
  • 以某種方式將字典集合綁定到 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 的評論,我似乎試圖通過創建DataTableDataColumnDataRow和其他類來重新發明輪子。

我刪除了我的類,並將我的代碼基於表的 System.Data 類。

此外, DataTable完美地綁定到DataGrid ,它解決了我所有的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM