我对整个C#.net的事情都很陌生,但我搜索了很多,我找不到如何让它工作。
我的视图中有一个DataGrid,如下所示:
<DataGrid Name="SettingGrid" ItemsSource="{Binding Path=PluginSettings, Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="True" Margin="224.4,10,10,10"/>
PluginSettings是一个DataTable,根据用户的操作动态填充不同的列和行。
PluginSettings总是最新的,我已经用调试模式检查过,列和行总是我想要它们。但视图永远不会更新。
经过一些谷歌搜索后,我发现DataTable不可枚举,因此无法绑定到。我将绑定更改为{Binding Path=PluginSettings.DefaultView
。
有了这个,我得到了完美的行,但列不是。
当我向DataTable添加列时,视图从不显示它。 如果我正确理解了DefaultView是什么,这意味着我无法将用户在网格上所做的更改复制到实际的DataTable来保存它们,这实际上就是我的目标。
我错过了什么吗? 使用DataGrid只是一个糟糕的选择,对于我想做的事情有没有更好的选择?
希望我明白我的意思,英语不是我的第一语言。 感谢
答案 0 :(得分:1)
System.Data
。System.Data.DataSet
,System.Data.DataTable
以及System.Data
命名空间内的任何其他类。 System.Data
是服务器端的概念,不应该转发给客户。System.Data
,所以如果您计划将WPF应用程序迁移到WinRT,那么您将需要重写很多代码。话虽如此,这个例子既可以添加新行,也可以添加新列:
<Window x:Class="MiscSamples.DataGridAndDataTable"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataGridAndDataTable" Height="300" Width="300">
<DockPanel>
<Button Content="Add Column" DockPanel.Dock="Top" Click="AddColumn"/>
<Button Content="Add Row" DockPanel.Dock="Top" Click="AddRow"/>
<DataGrid Name="SettingGrid"
ItemsSource="{Binding}"
AutoGenerateColumns="True"/>
</DockPanel>
</Window>
代码背后:
public partial class DataGridAndDataTable : Window
{
public DataTable PluginSettings { get; set; }
public DataGridAndDataTable()
{
InitializeComponent();
PluginSettings = new DataTable();
PluginSettings.Columns.Add("Name", typeof (string));
PluginSettings.Columns.Add("Date", typeof(DateTime));
PluginSettings.NewRow();
PluginSettings.NewRow();
PluginSettings.Rows.Add("Name01", DateTime.Now);
DataContext = PluginSettings;
}
private void AddColumn(object sender, RoutedEventArgs e)
{
PluginSettings.Columns.Add("Age", typeof (int));
DataContext = null;
DataContext = PluginSettings;
}
private void AddRow(object sender, RoutedEventArgs e)
{
PluginSettings.Rows.Add("Name01", DateTime.Now);
}
}