简体   繁体   中英

C# WPF Bindind DataGrid Columns Properties to list of classes

can anyone help me with binding properties of datagridcolumn? I just don't understand how to do it.

I have DataGrid with columns: 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>

And List of columns params:

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

class have variables:

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

So, i don't know how bind columns with that list of classes. Help me pls.

You can bind to your Columns collection in XAML but it is not so easy. And you need to have fixed index numbers in the Columns collection.

This is a starting point for what you can do in the code-behind instead.

This is the saving part in the Closing event handler:

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
                //...
            });
        }
    }

Revert the action in the Loading event to set the values.

You may need a little more advanced code to find the correct column. Here I have hardcoded to the first column.

    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;
    //..
        }
    }

Some observations:

Your name of class DataGridColumn conflict with the DataGrid's DataGridColumn. I have renamed your class to "MyDataGridColumn" above.

The DataGridColumn property Width is of type DataGridLength.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM