WPF UserControl DataGrid 列绑定 C#

WPF UserControl DataGrid Columns Binding C#

提问人:andboz 提问时间:11/16/2023 更新时间:11/16/2023 访问量:31

问:

我想在 WPF 中创建一个内部有一个 DataGrid 的 UserControl,我想像使用标准 DataGrid 一样使用它。 例如,我的 UserControl 如下所示:

<UserControl x:Class="SupervisoreIB.UI.CustomControls.DataGridWithHeader"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             ...
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="40"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>

        <Border Grid.Row="0">
            <Label Content="test" />
        </Border>
        <Border Grid.Row="1">
            <DataGrid />
        </Border>
    </Grid>
</UserControl>

我想使用它的方式是这样的:

<uc:DataGridWithHeader Grid.Row="1" Grid.Column="0" Margin="10">
    <uc:DataGridWithHeader.Columns>
        <DataGridTextColumn Header="COL1" />
        <DataGridTextColumn Header="COL2" />
        <DataGridTextColumn Header="COL3" />
    </uc:DataGridWithHeader.Columns>
</uc:DataGridWithHeader>

我尝试像这样使用Column DependencyProperty:

public ObservableCollection<DataGridColumn> Columns
{
    get { return (ObservableCollection<DataGridColumn>)GetValue(ColumnsProperty); }
    set { SetValue(ColumnsProperty, value); }
}

public static readonly DependencyProperty ColumnsProperty =
DependencyProperty.Register("Columns", typeof(ObservableCollection<DataGridColumn>), typeof(DataGridWithHeader), new PropertyMetadata(null, OnColumnsChanged));

但它似乎什么也没做。

C# WPF 绑定 DataGrid 用户控件

评论


答:

0赞 mm8 11/16/2023 #1

您应该在 的构造函数中初始化集合属性:UserControl

public partial class DataGridWithHeader : UserControl
{
    public DataGridWithHeader()
    {
        InitializeComponent();
        SetValue(ColumnsProperty, new ObservableCollection<DataGridColumn>());
    }

    ...
}

然后,您还需要使用回调中的列填充实际值,例如:DataGrid

private static void OnColumnsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    DataGridWithHeader dataGridWithHeader = (DataGridWithHeader)d;
    dataGridWithHeader.dataGrid.Columns.Clear();
    if (dataGridWithHeader.Columns != null)
        foreach (DataGridColumn column in dataGridWithHeader.Columns)
            dataGridWithHeader.dataGrid.Columns.Add(column);
}

评论

0赞 MIHOW 11/16/2023
或者可以在 Columns propdp 的 PropertyMetadata 中初始化集合