我目前正在尝试使用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
答案 0 :(得分:1)
将ListView
换成DataGrid
并使用其AutoGenerateColumns媒体资源。
此外,您需要对数据收集执行的任何格式设置都是在ViewModel中执行,然后才能从View中使用它。
<DataGrid ItemsSource="{Binding Data}"
AutoGenerateColumns="True"
EnableColumnVirtualization="True"
EnableRowVirtualization="True" />
您不需要在任何地方定义列,它们将根据您的DataTable列自动生成。使用最后两个属性,您可以激活虚拟化,这样您的RAM和处理器就不会被堵塞。
编辑 - 确保您的DataGrid使用自己的ScrollViewer。如果你将它放在另一个ScrollViewer或StackPanel内部,它将无法正确虚拟化。