c# - 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; }
}
所以,我不知道如何将列与该类列表绑定。请帮帮我。
解决方案
您可以在 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。
推荐阅读
- java - Apache Shiro ThreadContext#bind(Subject) vs ThreadContext.bind(SecurityManager)
- c++ - 如何正确分配我自己班级的地图。例如:地图
- python - 用 Tkinter、Python3 猜数字
- python - 如何比较两个 .csv 和 .xlsx 文件并打印出与特定字段不匹配的内容?
- jmeter - 如何在 JMeter 中为每个用户测试多个并行线程?
- android - Android 开发 - Text 和 Edittext 走向相反的方向
- python - 更改 QTextEdit 中的搜索路径
- laravel - Laravel - 根据项目数在导航栏中添加多个项目
- linux - 读取序列时未创建输出文件
- python - 高效转换 pandas 中的数据