在MVVM WPF中绑定数据表到数据网格

本文关键字:数据 数据网 网格 数据表 绑定 MVVM WPF | 更新日期: 2023-09-27 18:07:13

我对整个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是一个数据表,根据用户正在做的事情动态地填充不同的列和行。PluginSettings总是最新的,我已经检查了调试模式,列和行总是我想要的。但是视图永远不会更新。经过一些谷歌搜索,我发现DataTable是不可枚举的,所以不能绑定到。我把绑定改成了{Binding Path=PluginSettings.DefaultView。这样,行就可以完美地工作,但列却不能。

当我向DataTable添加一个列时,视图永远不会显示它。如果我正确理解了什么是DefaultView,它意味着我不能复制用户在Grid上做的改变到实际的DataTable中去保存它们,这就是我的目标。

我错过什么了吗?使用DataGrid是一个糟糕的选择吗?我想做的事情是否有更好的选择?

希望我说的很清楚,英语不是我的第一语言。由于

在MVVM WPF中绑定数据表到数据网格

    我必须提到,不鼓励在客户端代码(WPF)中使用System.Data
  • 这包括System.Data.DataSet, System.Data.DataTableSystem.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);
        }
    }