首頁 >後端開發 >C++ >如何將動態列數綁定到 WPF DataGrid?

如何將動態列數綁定到 WPF DataGrid?

Susan Sarandon
Susan Sarandon原創
2025-01-22 08:33:13154瀏覽

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

WPF DataGrid:動態綁定列數

問題:

一個WPF應用程式產生具有可變列數的資料集,所需的列描述包含在輸出中。用於以程式設計方式建立列的程式碼涉及使用字串格式化的綁定,例如:

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

目標是用XAML檔案中的資料綁定取代此程式碼。

解:

DataGrid的Columns屬性是唯讀的,無法直接綁定。但是,可以使用名為BindableColumns的附加屬性作為解決方法:

<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>

在XAML檔案中,將BindableColumns屬性綁定到列集合:

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

BindableColumnsPropertyChanged方法在綁定集合變更時更新Columns屬性:

<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>

此方法偵聽集合變更(新增、刪除、取代)並相應地更新Columns屬性。 需要注意的是,在BindableColumnsPropertyChanged方法中,加入了對dataGrid實例的獲取,並對集合變化事件進行了更完善的處理,確保列的更新同步。

以上是如何將動態列數綁定到 WPF DataGrid?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn