【发布时间】:2019-04-23 11:10:10
【问题描述】:
在我的解决方案中,我创建了两个列表
var listColumnNames = new List<KeyValuePair<string, string>>();
和
var listValues = new List<List<string>>();
我通过迭代输入数据集来添加数据。两个列表都构建得很好,并且包含预期的数据。随后,我使用两个 for 循环将数据添加到 DataTable。 DataTable 被实例化为private DataTable _selectedFeaturesDataTable = new DataTable(); 和稍后,在我从上面实例化并填充两个列表的任务中,我在列表接收到所有数据后编写以下内容:
_selectedFeaturesDataTable = new DataTable();
foreach (var col in listColumnNames)
{
_selectedFeaturesDataTable.Columns.Add(new DataColumn(col.Key, typeof(string)) { Caption = col.Value });
}
foreach (var row in listValues)
{
var newRow = _selectedFeaturesDataTable.NewRow();
newRow.ItemArray = row.ToArray();
_selectedFeaturesDataTable.Rows.Add(newRow);
}
调试代码我可以看到newRow 的ItemArray 在迭代期间包含正确的数据,而且所有值都是字符串类型。 ItemArray 中的某些列包含空字符串,但我无法想象这是问题所在。
_selectedFeaturesDataTable.Rows.Add(newRow); 行运行低谷并查看DataTable 的Rows 属性,我可以看到每次迭代的计数都会增加。但是,DataTable 中 Rows 的 List 属性的值仍然为 null。
现在有例外,没有抱怨,但在DataTable 中找不到数据,而列接收列表中的值。
此外,UI 中的组件甚至不显示列名。
最后,这是我在 xaml 中定义 DataGrid 的方式以及我用于绑定的属性。
XAML
<DataGrid x:Name="winDataTable" Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" HeadersVisibility="Column"
IsReadOnly="True" SelectionMode="Single" AutoGenerateColumns="True"
ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ItemsSource="{Binding Path=SelectedFeatureDataTable, Mode=OneWay}">
属性定义
public DataTable SelectedFeatureDataTable
{
get
{
return _selectedFeaturesDataTable;
}
set
{
SetProperty(ref _selectedFeaturesDataTable, value, () => SelectedFeatureDataTable);
}
}
为什么没有数据添加到 DataTable 对象,即使 ItemArray 包含值?
【问题讨论】:
-
我有类似的问题,然后我意识到我必须实现
INotifyPropertyChanged,当我更改数据源的内容时,我必须调用RaisePropertyChanged()方法 -
嗨 Leon,我必须坚持 MVVM 概念,因此整个事情实际上应该与绑定一起工作。我所有的逻辑都应该在 ViewModel 中,如果可能的话,代码隐藏文件中没有其他代码。这可能吗?
标签: c# datatable datagrid wpfdatagrid