将DataTable绑定到MVVM WPF中的DataGrid

时间:2013-04-02 22:14:01

标签: c# .net wpf mvvm

我对整个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只是一个糟糕的选择,对于我想做的事情有没有更好的选择?

希望我明白我的意思,英语不是我的第一语言。 感谢

1 个答案:

答案 0 :(得分:1)

  • 我必须提到不鼓励在客户端代码(WPF)中使用System.Data
  • 这包括System.Data.DataSetSystem.Data.DataTable以及System.Data命名空间内的任何其他类。
  • 您应该创建正确的数据模型并使用它。
  • IMO,System.Data是服务器端的概念,不应该转发给客户。
  • 例如,在WinRT中,
  • 甚至不存在。没有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);
        }
    }