Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何构建列数未知的WPF数据网格_C#_Wpf_Xaml_Datagrid - Fatal编程技术网

C# 如何构建列数未知的WPF数据网格

C# 如何构建列数未知的WPF数据网格,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我需要从一个txt文件中获取的字符串数组集合中构建和显示一个WPF数据网格。问题是我不知道一个先验的列数,即单个数组中的项数。所以我在我的xaml 我试图在视图模型中填充它,但我不能简单地将数组的集合(可观察集合)作为项源,因为datagrid将只显示空行 我还可以在可观察集合上使用其他方法,因为我使用相同的方法生成数组 这是我的可观察收藏: ObservableCollection<string[]> Rows = new ObservableCollection<strin

我需要从一个txt文件中获取的字符串数组集合中构建和显示一个WPF数据网格。问题是我不知道一个先验的列数,即单个数组中的项数。所以我在我的xaml

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

我还可以在可观察集合上使用其他方法,因为我使用相同的方法生成数组

这是我的可观察收藏:

ObservableCollection<string[]> Rows = new ObservableCollection<string[]>;
请不要介意分开前的第一部分。我从以前使用的文本块列表视图中获取数据(我有我的理由)

EDIT1:使代码更具可读性


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

如果您不知道编译时的列数,则需要以编程方式创建列。在视图中,这应该是非常直接的。下面的示例代码应该能让您了解这一点:

public MainWindow()
{
    InitializeComponent();
    var viewModel = new ViewModel();
    var rows = viewModel.Rows;
    int numberOfColumns = rows[0].Length; //assume all string[] have the same length
    DataContext = new VM1();

    for (int i = 0; i < numberOfColumns; ++i)
    {
        dataGrid1.Columns.Add(new DataGridTextColumn() { Binding = new Binding("[" + i + "]"), Header = i.ToString() });
    }
    dataGrid1.ItemsSource = rows;
}
public主窗口()
{
初始化组件();
var viewModel=新的viewModel();
var rows=viewModel.rows;
int numberOfColumns=行[0].Length;//假设所有字符串[]的长度相同
DataContext=newVM1();
对于(int i=0;i
在.Net中没有。它的主要用途是与关系数据库通信,但可以很好地用于存储、显示和编辑表格数据(例如,在wpf中读取和显示.csv/Excel文件->
DataTable+DataGrid
,在WinForms中读取和显示.csv/Excel文件->
DataTable+DataGrid

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

注意:当分配新的ItemsSource时,DataGrid不会清除
。因此,可以有一些预定义的列并使用autogenerate

注意:默认情况下,DataGrid创建
DataGridTextColumn
s。如果需要更复杂的模板,可以通过
AutoGeneratingColumn
event()截取流程

以下是一个例子:

代码

xaml


结果(我输入了一些值)


你不应该用文本块做这些奇怪的事情。您应该只将ItemsSource绑定到viewmodel中的ObservableCollection,就像您尝试的那样。如果您向我们展示您尝试使用这种方式时所使用的所有代码,我们可以帮助您正确操作。您希望得到哪些列标题?@Daniele,您可以使用
DataTable
存储值并以DataGrid@ASh你能解释一下怎么做吗?我已经创建了一个数据表,并填充了我的数据。我修改了我的xamul,如下所示:但我的数据网格仍然是空的。测试是我的数据表。我甚至尝试将我的datatable保存为DataView,但没有results@DanieleSartori,
AutoGenerateColumns
应该是
True
并且
ItemsSource
需要IEnumerable(dataTable.DefaultView,
ItemsSource=“{Binding Path=DefaultView}”
),这肯定是一个解决方案。我只想在视图模型中这样做视图模型不应该负责创建DataGrid列。这将打破MVVM模式。这是属于视图的基于视图的功能。VM只是公开一个集合供视图绑定。@mm8您如何将集合与绑定联系起来?
public MainWindow()
{
    InitializeComponent();
    var viewModel = new ViewModel();
    var rows = viewModel.Rows;
    int numberOfColumns = rows[0].Length; //assume all string[] have the same length
    DataContext = new VM1();

    for (int i = 0; i < numberOfColumns; ++i)
    {
        dataGrid1.Columns.Add(new DataGridTextColumn() { Binding = new Binding("[" + i + "]"), Header = i.ToString() });
    }
    dataGrid1.ItemsSource = rows;
}
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;

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