Heim > Backend-Entwicklung > C++ > Wie binde ich eine dynamische Anzahl von Spalten an ein WPF-DataGrid?

Wie binde ich eine dynamische Anzahl von Spalten an ein WPF-DataGrid?

Susan Sarandon
Freigeben: 2025-01-22 08:33:13
Original
195 Leute haben es durchsucht

How to Bind a Dynamic Number of Columns to a WPF DataGrid?

WPF DataGrid: Binden Sie die Anzahl der Spalten dynamisch

Frage:

Eine WPF-Anwendung generiert einen Datensatz mit einer variablen Anzahl von Spalten, die erforderlichen Spaltenbeschreibungen sind in der Ausgabe enthalten. Der Code zum programmgesteuerten Erstellen von Spalten beinhaltet die Bindung mithilfe einer Zeichenfolgenformatierung, zum Beispiel:

<code class="language-csharp">dataGrid.Columns.Add(new DataGridTextColumn
{
    Header = data.ColumnDescriptions[i].Name,
    Binding = new Binding(string.Format("[{0}]", i))
});</code>
Nach dem Login kopieren

Ziel ist es, diesen Code durch die Datenbindung in der XAML-Datei zu ersetzen.

Lösung:

Die Columns-Eigenschaft von DataGrid ist schreibgeschützt und kann nicht direkt gebunden werden. Als Workaround kann jedoch eine zusätzliche Eigenschaft namens BindableColumns verwendet werden:

<code class="language-csharp">public class DataGridColumnsBehavior
{
    // 附加属性,绑定到DataGridColumn集合
    public static readonly DependencyProperty BindableColumnsProperty =
        DependencyProperty.RegisterAttached("BindableColumns",
                                            typeof(ObservableCollection<DataGridColumn>),
                                            typeof(DataGridColumnsBehavior),
                                            new UIPropertyMetadata(null, BindableColumnsPropertyChanged));
}</code>
Nach dem Login kopieren

Binden Sie in der XAML-Datei die BindableColumns-Eigenschaft an die Spaltensammlung:

<code class="language-xml"><DataGrid ... AutoGenerateColumns="False" local:DataGridColumnsBehavior.BindableColumns="{Binding ColumnCollection}" Name="dataGrid"></DataGrid></code>
Nach dem Login kopieren
<code class="language-csharp">public ObservableCollection<DataGridColumn> ColumnCollection
{
    get;
    private set;
}</code>
Nach dem Login kopieren

Die BindableColumnsPropertyChanged-Methode aktualisiert die Columns-Eigenschaft, wenn sich die gebundene Sammlung ändert:

<code class="language-csharp">private static void BindableColumnsPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
    DataGrid dataGrid = source as DataGrid; // 获取DataGrid实例

    // 清除现有列
    dataGrid.Columns.Clear();

    ObservableCollection<DataGridColumn> columns = e.NewValue as ObservableCollection<DataGridColumn>;
    if (columns == null)
    {
        return;
    }

    // 添加新列
    foreach (DataGridColumn column in columns)
    {
        dataGrid.Columns.Add(column);
    }

    // 处理集合更改
    columns.CollectionChanged += (sender, e2) =>
    {
        // ...  处理集合变化,例如重新绑定列
        dataGrid.Columns.Clear();
        foreach (DataGridColumn column in columns)
        {
            dataGrid.Columns.Add(column);
        }
    };
}</code>
Nach dem Login kopieren

Diese Methode wartet auf Sammlungsänderungen (Hinzufügen, Löschen, Ersetzen) und aktualisiert die Columns-Eigenschaft entsprechend. Es ist zu beachten, dass in der BindableColumnsPropertyChanged-Methode die Erfassung der dataGrid-Instanz hinzugefügt wird und das Sammlungsänderungsereignis vollständiger verarbeitet wird, um sicherzustellen, dass Spaltenaktualisierungen synchronisiert werden.

Das obige ist der detaillierte Inhalt vonWie binde ich eine dynamische Anzahl von Spalten an ein WPF-DataGrid?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage