将数据绑定到列数未知的ListView

时间:2015-07-20 13:10:00

标签: c# wpf data-binding

我目前正在尝试使用CSV文件中的用户导入的数据填充ListView。因此,我在编译时对列数及其名称一无所知,这就是为什么我在代码中创建GridView及其列并将其设置为ListView' s View财产。

通常ListView在数据绑定时支持虚拟化,但由于上述问题,我无法绑定它。事实上,视图需要虚拟化,因为我希望用户能够导入数万行的CSV。

由于我对WPF和MVVM一般都很陌生,我可能会以错误的方式思考这个问题,但我还没有在这里或任何地方找到解决问题的实际方法。我认为这可能是我代表绑定到GridView的数据的方式,public class DataSet { public double[] Data { get; private set; } public double[] Targets { get; private set; } ... } 是一个数据为数组的自定义类,如此

for (int i = 0; i < numDataSets; i++)
{
    gridView.Columns.Add( new GridViewColumn()
    {
        Header = "N" + (i + 1),
        Width = 40d,
        DisplayMemberBinding = new Binding("Targets[" + i + "]")
     });
}

并在像这样的代码中绑定

ListView

第二个Data用于显示DataSet类的DataGrid数组变量,以避免混淆。

修改

这是我目前用作各种数据提供者的新ViewModel。此模型绑定到public class DataModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged (string propName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propName)); // error thrown here } private System.Data.DataTable data; public System.Data.DataTable Data { get { return data; } set { if (data != value) { data = value; OnPropertyChanged("Data"); } } } } 的ItemSource属性,当新数据入站时,将从中创建一个新的DataTable并将其设置为ViewModels属性

https://api.github.com/repos/nickperkinslondon/angular-bootstrap-nav-tree/forks

1 个答案:

答案 0 :(得分:1)

ListView换成DataGrid并使用其AutoGenerateColumns媒体资源。

此外,您需要对数据收集执行的任何格式设置都是在ViewModel中执行,然后才能从View中使用它。

<DataGrid ItemsSource="{Binding Data}"
          AutoGenerateColumns="True"
          EnableColumnVirtualization="True"
          EnableRowVirtualization="True" />

您不需要在任何地方定义列,它们将根据您的DataTable列自动生成。使用最后两个属性,您可以激活虚拟化,这样您的RAM和处理器就不会被堵塞。

编辑 - 确保您的DataGrid使用自己的ScrollViewer。如果你将它放在另一个ScrollViewer或StackPanel内部,它将无法正确虚拟化。