C# 如何更新WPF';当I';我在实现MVVM吗?(无任何按钮)

C# 如何更新WPF';当I';我在实现MVVM吗?(无任何按钮),c#,wpf,mvvm,C#,Wpf,Mvvm,我已经制作了一个没有MVVM的WPF应用程序,并且我确实使用了一些事件(比如CellEditEnding)来更新我的行,但是现在我想在MVVM中做同样的事情,所以我不打算使用任何事件,我应该在我的ViewModel中这样做 我怎么做?(我喜欢只更新更改的行的方式)。我想使用Datagrid的功能,而不是使用任何按钮,如更新按钮 顺便说一句,当我完成这项工作时,我会使用完整的积垢系统 在我看来,WPF和MVVM最重要的“东西”是数据绑定。因此,您不必确切地告诉GUI要做什么(如CellEditE

我已经制作了一个没有MVVM的WPF应用程序,并且我确实使用了一些事件(比如CellEditEnding)来更新我的行,但是现在我想在MVVM中做同样的事情,所以我不打算使用任何事件,我应该在我的ViewModel中这样做

我怎么做?(我喜欢只更新更改的行的方式)。我想使用Datagrid的功能,而不是使用任何按钮,如更新按钮

  • 顺便说一句,当我完成这项工作时,我会使用完整的积垢系统
    • 在我看来,WPF和MVVM最重要的“东西”是数据绑定。因此,您不必确切地告诉GUI要做什么(如CellEditEnding等),而是将编辑工作留给GUI(视图),只需在Viewmodel中处理数据

      正如您在下面的示例中所看到的(虽然很简单),没有关于如何更新单元格之类的代码,只有一个数据绑定—将ObservableCollection绑定到DataGrid的ItemsSource

      例如:

      <Window x:Class="WpfApplication12.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:WpfApplication12="clr-namespace:WpfApplication12"
              Title="MainWindow" Height="350" Width="525">
          <Window.DataContext>
              <WpfApplication12:MainWindowViewModel />
          </Window.DataContext>
          <Grid>
              <DataGrid ItemsSource="{Binding PersonList}">
      
              </DataGrid>
          </Grid>
      </Window>
      
      
      
      C#代码隐藏:

      public class MainWindowViewModel : INotifyPropertyChanged
      {
          public MainWindowViewModel()
          {
              PersonList = new ObservableCollection<Person>()
                               {
                                   new Person(){Name="Bobby"}
                                };
          }
          public ObservableCollection<Person> PersonList { get; set; }
          public void OnPropertyChanged(string p)
          {
              if (PropertyChanged != null)
              {
                  PropertyChanged(this, new PropertyChangedEventArgs(p));
              }
          }
          public event PropertyChangedEventHandler PropertyChanged;
      }
      public class Person : INotifyPropertyChanged
      {
          private string name;
      
          public string Name
          {
              get { return name; }
              set
              {
                  if (name != value)
                  {
                     name = value;
                     OnPropertyChanged("Name");
                   }
             }
          }
          public void OnPropertyChanged(string p)
          {
             if (PropertyChanged != null)
             {
                 PropertyChanged(this, new PropertyChangedEventArgs(p));
              }
          }
          public event PropertyChangedEventHandler PropertyChanged;
      }
      
      public类MainWindowViewModel:INotifyPropertyChanged
      {
      公共主窗口视图模型()
      {
      PersonList=新的ObservableCollection()
      {
      新人(){Name=“Bobby”}
      };
      }
      公共ObservableCollection个人列表{get;set;}
      公共void OnPropertyChanged(字符串p)
      {
      if(PropertyChanged!=null)
      {
      房地产变更(这是新的房地产变更发展(p));
      }
      }
      公共事件属性更改事件处理程序属性更改;
      }
      公共类人员:INotifyPropertyChanged
      {
      私有字符串名称;
      公共字符串名
      {
      获取{返回名称;}
      设置
      {
      如果(名称!=值)
      {
      名称=值;
      不动产变更(“名称”);
      }
      }
      }
      公共void OnPropertyChanged(字符串p)
      {
      if(PropertyChanged!=null)
      {
      房地产变更(这是新的房地产变更发展(p));
      }
      }
      公共事件属性更改事件处理程序属性更改;
      }
      
      正如我前面所说的,这很简单,因为它只是让你开始

      在我看来,WPF和MVVM最重要的“事情”是数据绑定。因此,您不必确切地告诉GUI要做什么(如CellEditEnding等),而是将编辑工作留给GUI(视图),只需在Viewmodel中处理数据

      正如您在下面的示例中所看到的(虽然很简单),没有关于如何更新单元格之类的代码,只有一个数据绑定—将ObservableCollection绑定到DataGrid的ItemsSource

      例如:

      <Window x:Class="WpfApplication12.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:WpfApplication12="clr-namespace:WpfApplication12"
              Title="MainWindow" Height="350" Width="525">
          <Window.DataContext>
              <WpfApplication12:MainWindowViewModel />
          </Window.DataContext>
          <Grid>
              <DataGrid ItemsSource="{Binding PersonList}">
      
              </DataGrid>
          </Grid>
      </Window>
      
      
      
      C#代码隐藏:

      public class MainWindowViewModel : INotifyPropertyChanged
      {
          public MainWindowViewModel()
          {
              PersonList = new ObservableCollection<Person>()
                               {
                                   new Person(){Name="Bobby"}
                                };
          }
          public ObservableCollection<Person> PersonList { get; set; }
          public void OnPropertyChanged(string p)
          {
              if (PropertyChanged != null)
              {
                  PropertyChanged(this, new PropertyChangedEventArgs(p));
              }
          }
          public event PropertyChangedEventHandler PropertyChanged;
      }
      public class Person : INotifyPropertyChanged
      {
          private string name;
      
          public string Name
          {
              get { return name; }
              set
              {
                  if (name != value)
                  {
                     name = value;
                     OnPropertyChanged("Name");
                   }
             }
          }
          public void OnPropertyChanged(string p)
          {
             if (PropertyChanged != null)
             {
                 PropertyChanged(this, new PropertyChangedEventArgs(p));
              }
          }
          public event PropertyChangedEventHandler PropertyChanged;
      }
      
      public类MainWindowViewModel:INotifyPropertyChanged
      {
      公共主窗口视图模型()
      {
      PersonList=新的ObservableCollection()
      {
      新人(){Name=“Bobby”}
      };
      }
      公共ObservableCollection个人列表{get;set;}
      公共void OnPropertyChanged(字符串p)
      {
      if(PropertyChanged!=null)
      {
      房地产变更(这是新的房地产变更发展(p));
      }
      }
      公共事件属性更改事件处理程序属性更改;
      }
      公共类人员:INotifyPropertyChanged
      {
      私有字符串名称;
      公共字符串名
      {
      获取{返回名称;}
      设置
      {
      如果(名称!=值)
      {
      名称=值;
      不动产变更(“名称”);
      }
      }
      }
      公共void OnPropertyChanged(字符串p)
      {
      if(PropertyChanged!=null)
      {
      房地产变更(这是新的房地产变更发展(p));
      }
      }
      公共事件属性更改事件处理程序属性更改;
      }
      

      正如我前面所说的,这很简单,因为它只是让你开始

      法扎德,你运气好吗?我也被困在同一个问题上,找不到任何现实世界的答案比下面坦德隆的答案“简单入门”更有用!谢谢Tendlon,但是我们已经过了简单的阶段,并且深入到了不那么简单的阶段,我如何将这一行的变化转换成我的DB?!法扎德,你运气好吗?我也被困在同一个问题上,找不到任何现实世界的答案比下面坦德隆的答案“简单入门”更有用!谢谢Tendlon,但是我们已经过了简单的阶段,并且深入到了不那么简单的阶段,我如何将这一行的变化转换成我的DB?!