当前位置 : 主页 > 编程语言 > c语言 >

c# – 如何构建具有未知列数的WPF Datagrid

来源:互联网 收集:自由互联 发布时间:2021-06-25
我需要从我从txt获得的字符串数组的集合中构建和显示 WPF数据网格.问题是我不知道先验的是列数,即单个数组中的项目数.所以我在我的xaml中定义 DataGrid Grid.Row =“2”ItemsSource =“{Bindi
我需要从我从txt获得的字符串数组的集合中构建和显示 WPF数据网格.问题是我不知道先验的是列数,即单个数组中的项目数.所以我在我的xaml中定义< DataGrid Grid.Row =“2”ItemsSource =“{Binding Path = Rows}”/>

我试图在我的视图模型中填充它,但我不能简单地将我的数组的集合(Observable Collection)作为项目源,因为datagrid将只显示空行.

我也可以使用其他方法而不是Observable集合,因为我使用相同的方法生成我的数组

这是我的Observable Collection:

ObservableCollection<string[]> Rows = new ObservableCollection<string[]>;

在这个方法中我填写了集合

foreach(ListViewItem item in wsettings.lista)
        {                 
            TextBlock line = item.Content as TextBlock;
            string txt = line.Text;
            string[] x = txt.Split(stringSeparators, StringSplitOptions.None);               
            Rows.Add(x);
        }

请不要介意分手前的第一部分.我从我之前使用的文本块的列表视图中获取数据(我有我的理由).

EDIT1:使代码更具可读性

EDIT2:标题必须是用户必须设置的组合框

.Net中有 DataTable class.它的主要目的是与关系数据库进行通信,但它可以很好地用于存储,显示和编辑表格数据(例如,读取和显示.csv / Excel文件 – > wpf中的DataTable DataGrid,WinForms中的DataTable DataGridView).

DataTable列(DataColumn)可以在运行时添加/删除,DataGrid为它们自动生成列(DataGridColumn)(默认情况下启用),使用标题的Name属性. DataTable也支持开箱即用的排序和过滤.

注意:分配新的ItemsSource时,DataGrid不会清除列.因此可以有一些预定义的列并使用自动生成.

注意:默认情况下,DataGrid会创建DataGridTextColumns.如果需要更复杂的模板,可以通过AutoGeneratingColumn事件拦截该过程(see example)

这是一个例子:

public class MyViewModel
{
    public DataTable Test { get; set; }
}

public MyWindow()
{
    InitializeComponent();
    var vm = new MyViewModel
                {
                    Test = new DataTable
                        {
                            Columns = {"A", "B", "C"}
                        }
                };            
    this.DataContext = vm;

}

XAML

<DataGrid AutoGenerateColumns="True"
          ItemsSource="{Binding Path=Test.DefaultView}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="#"/>
    </DataGrid.Columns>
</DataGrid>

结果(我输入了一些值)

网友评论