【发布时间】:2019-06-30 03:21:24
【问题描述】:
我一直在研究这个小程序,它需要接受 CSV 文件的文件输入,将它们存储在列表框中,然后自动更新数据网格。当添加更多文件时,datagrid需要用新的文件数据扩展并添加到它旁边。
- 有效的方法是使用 XAML 代码和代码隐藏中的绑定将文件添加到列表框。
- 不起作用的是合并数据以动态显示与数据网格的绑定。属性已更改,但网格未更新。
在 DataGridViewModel 中是我的 csv 合并代码所在的位置:
public class DataGridViewModel
{
static public DataGridModel _dataGridModel = new DataGridModel();
public static void ReturnDataTableForGridView()
{
DataTable mainTable = new DataTable();
//-- #3 Test merge
foreach (var item in SidePanelViewModel.GetPathFileList())
{
DataTable dataTable = new DataTable();
try
{
string[] Lines = File.ReadAllLines(item.Filepath);
string[] Fields;
Fields = Lines[0].Split(new char[] { ';' });
int Cols = Fields.GetLength(0);
//1st row skal være kolonne navn;
for (int X = 0; X < Cols; X++)
dataTable.Columns.Add(Fields[X].ToLower(), typeof(string));
DataRow Row;
for (int T = 1; T < Lines.GetLength(0); T++)
{
Fields = Lines[T].Split(new char[] { ';' });
Row = dataTable.NewRow();
for (int f = 0; f < Cols; f++)
Row[f] = Fields[f];
dataTable.Rows.Add(Row);
}
//-- Merges every files(tables) into one.
mainTable.Merge(dataTable);
}
catch (Exception)
{
return null;
}
}
//-- Sets the datatablemerger which raises the propertychanged
_dataGridModel.DatatableMerger = mainTable;
}
}
DataGridModel 类
public class DataGridModel : INotifyPropertyChanged
{
DataTable _dataTableMerger { get; set; } = new DataTable();
public DataTable DatatableMerger
{
get
{
return _dataTableMerger;
}
set
{
_dataTableMerger = value;
OnPropertychanged("DatatableMerger");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertychanged([CallerMemberName] string caller = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(caller));
}
}
dataGridview 类
public DataGridView()
{
InitializeComponent();
}
XAML 代码:
<DataGrid x:Name="MainDataGrid" Grid.Row="1" VerticalAlignment="Stretch" Height="auto" ItemsSource="{Binding Path=DatatableMerger, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" >
</DataGrid>
</Grid>
<UserControl.DataContext>
<Model:DataGridModel/>
</UserControl.DataContext>
当前输出:
希望的输出:
【问题讨论】:
-
我看不到您在添加文件后刷新
DataGrid内容的位置。添加按钮事件处理程序中有一个DataGridViewModel.ReturnDataTableForGridView();,但这不会更新DataGrid。没有引发PropertyChanged或CollectionChanged事件。 -
@redcurry 我不确定如何正确解决这个问题。我看到了另一个示例,并在 datagridviewmodel 中添加了所有内容。在这里,我添加了一个数据视图,它可以通过返回数据表引发 propertychanged 事件,并将其绑定到 XAML。现在我看到它引发了事件,但网格没有更新。一些使用 = delegate {} 但没有任何反应。然后我看到数据表无法通过 propertychanged 提升,这就是我将其更改为 dataview 的原因。我还看到了 kiwipom 的这篇文章寻求帮助:LINK。
-
如果您希望数据刷新时查看 Visual Studio 中的“输出”窗口,是否看到任何绑定错误?
-
@redcurry 什么都没有。我现在已经更新了整个代码,并添加了propertychanged,因此您可以查看数据流中的具体内容。我还在这里找到了有关绑定的 ekstra 信息:来自 syned 的LINK。 XAML 更改后仍然没有。
-
@redcurry 你好。我只是得到一个答案来解决我的问题。非常感谢您的宝贵时间。 - Answar 已发布。