首页 > 解决方案 > C# WPF 将 DataGrid 列属性绑定到类列表

问题描述

谁能帮我绑定datagridcolumn的属性?我只是不明白该怎么做。

我有带有列的 DataGrid:xaml

<DataGrid x:Name="DataGrid" ItemsSource="{Binding Path=RPS, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False"
                      IsReadOnly="True" SelectedItem="{Binding SelectedItem}"
                          material:DataGridAssist.CellPadding="0 5 3 5"
                          material:DataGridAssist.ColumnHeaderPadding="4 2 2 2"
                          Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=UserControl}}">

                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="SelectionChanged">
                                <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=DataGrid, Path=SelectedItems}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                     
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="##" Binding="{Binding TestNumber}"></DataGridTextColumn>
                            <DataGridTemplateColumn Header="State">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <Image Source="{Binding Icon}" Width="15" VerticalAlignment="Center" ToolTip="{Binding Message}" Height="15"></Image>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            
                           
                            <DataGridTextColumn x:Name="ColSize" Header="Size" Binding="{Binding Size}"></DataGridTextColumn>
                            <DataGridTextColumn x:Name="ColName" Header="File Name" Binding="{Binding Name}"></DataGridTextColumn>
                            <DataGridTextColumn x:Name="ColVehicle" Header="Vehicle" Binding="{Binding Vehicle}"></DataGridTextColumn>
                            <DataGridTextColumn x:Name="ColVersion" Header="Version" Binding="{Binding Version}"></DataGridTextColumn>
                            <DataGridTextColumn x:Name="ColDateTime" Header="DateTime" Binding="{Binding DateTime, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}"></DataGridTextColumn>
                            <DataGridTextColumn x:Name="ColUnix" Header="Unix" Binding="{Binding ArenaCreationTime}"></DataGridTextColumn>
                           
                        </DataGrid.Columns>
                        
                    </DataGrid>

和列参数列表:

public List<DataGridColumn> Columns { get; set; }

类有变量:

public class DataGridColumn
{
public string Text { get; set; }
public string SubText { get; set; }
public bool IsVisible { get; set; }
public int Width { get; set; }
public int Position { get; set; }
}

所以,我不知道如何将列与该类列表绑定。请帮帮我。

标签: c#wpfclassbindingdatagrid

解决方案


您可以在 XAML 中绑定到您的 Columns 集合,但这并不容易。并且您需要在 Columns 集合中有固定的索引号。

这是您可以在代码隐藏中执行的操作的起点。

这是 Closing 事件处理程序中的保存部分:

private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        //Extract the properties for each column into the Columns collection
        Columns.Clear();
        foreach (DataGridColumn col in DataGrid.Columns)
        {
            Columns.Add(new MyDataGridColumn() 
            { 
                Text = col.Header?.ToString(), 
                Width=col.Width
                //...
            });
        }
    }

还原 Loading 事件中的操作以设置值。

您可能需要更高级的代码才能找到正确的列。在这里,我已经硬编码到第一列。

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        foreach (MyDataGridColumn col in Columns)
        {
            DataGrid.Columns[0].Header = col.Text;
            DataGrid.Columns[0].Width = col.Width;
    //..
        }
    }

一些观察:

您的 DataGridColumn 类名称与 DataGrid 的 DataGridColumn 冲突。我已将您的课程重命名为上面的“MyDataGridColumn”。

DataGridColumn 属性 Width 的类型为 DataGridLength。


推荐阅读