更新ObservableCollection后没有Datagrid编辑的新行

时间:2017-02-08 13:57:13

标签: c# wpf datagrid

我遇到了DataGrid在输入新记录后没有新空行的问题。

似乎只有在更新ObversableCollection<T>后才会发生。

我用它来绑定到集合:

public partial class MainWindow : INotifyPropertyChanged
{
    public MainWindow()
    {
    DataContext = this; 
    InitializeComponent();       

    CollectionLists.CalculationTableSourceCollection(CalculationTblSourceObserv, @"section", @"sectionAll");
    CalculationTableGrid.ItemsSource = CalculationTblSourceObserv;
    }
public ObservableCollection<CalculationListTbl> CalculationTblSourceObserv { get; set; } 
 = new ObservableCollection<CalculationListTbl>();
}

这是我更新ObversableCollection<T>的代码:

class CollectionLists
{
public static void CalculationTableSourceCollection(ObservableCollection<CalculationListTbl> observable,
  string section, string sectionAll)
    {
            using (DatabaseDataContext dataContext = new DatabaseDataContext(MainWindow.InstanceConnectionString))
        {
            observable.Clear();
            var source = DatabaseQueries.CalculationTableSourceAll(sectionAll, dataContext);
            if (source == null) return;
            foreach (var item in source)
            {
                observable.Add(item);
            }
        }
    }
}

这就是XAML:

<DataGrid x:Name="CalculationTableGrid" Grid.Column="2" 
       AutoGenerateColumns="False" ItemsSource="{Binding}" 
       Grid.Row="1" Grid.RowSpan="12" AlternationCount="2" 
       CanUserAddRows="True" CanUserSortColumns="False" 
       CanUserDeleteRows="True" GridLinesVisibility="None" 
       CellEditEnding="CalculationTableGrid_OnCellEditEnding" 
       VerticalAlignment="Top">

    <DataGrid.Columns>
        <DataGridTextColumn Width="*" Header="項目" 
           Binding="{Binding UpdateSourceTrigger=PropertyChanged, Path=ListItems, Mode=TwoWay}" />
    </DataGrid.Columns>

</DataGrid>

我使用此方法更新dataGrid

private void CalculationTableGrid_OnCellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
     ShiftTypeData.UserInputData.AddNewDataShiftInputRecords(e, MainUserId, EmployeesNameNumberPairsAll, CalculationTblListObserv, DateFilter);
     CollectionLists.CalculationTableSourceCollection(CalculationTblSourceObserv, @"section", @"sectionAll");               
}

所以一切正常,在插入新记录后,DataGrid' is updated, the database is correctly updated and the ObversableCollection is updated. However the DataGrid`应该添加一个新行,但这就是它的作用。

这就是它的作用,

enter image description here

但是,在CollectionLists.CalculationTableSourceCollection(CalculationTblSourceObserv, @"section", @"sectionAll");事件中注释掉这一行CalculationTableGrid_OnCellEditEnding可以使其正确行为,并在制作新记录后添加一个空行,如下所示:

enter image description here

这里发生了什么,我无法正常工作,任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

您似乎正在更新属性CalculationTblSourceObserv,但您已在xaml中限制了属性ListItems。所以要么在xaml中绑定CalculationTblSourceObserv,要么可以执行以下操作。

在您的问题中,我无法查看代码的哪一部分属性&#39; ListItems&#39;存在,这是绑定到数据网格的属性。希望这是一个视图模型。

所以要么你的财产&#39; ListItems&#39;没有得到更新,或者如果它正在更新,那么您的xaml不会收到有关该更改的通知。您的视图模型代码应通知xaml已更新属性。这是通过引发属性更改事件来完成的,可以这样做:

public string ListItems
{
    get { return listItems; }
    set
    {
         listItems= value;
         // Call OnPropertyChanged whenever the property is updated
         OnPropertyChanged("ListItems");
     }
}

  // Create the OnPropertyChanged method to raise the event
  protected void OnPropertyChanged(string name)
  {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (handler != null)
      {
          handler(this, new PropertyChangedEventArgs(name));
      }
  }

进一步参考链接:How to: Implement Property Change Notification

答案 1 :(得分:1)

此处的问题是,在添加新项目时会引发CellEditEnding事件,然后您立即在CalculationTableSourceCollection方法中清除CalculationTableSourceCollection

您根本不必在CalculationTableSourceCollection事件处理程序中调用CellEditEnding方法。

您添加或移除到ObservableCollection<T>的任何项目都会自动显示在DataGrid中。这是ObservableCollection<T>List<T>不同的原因。后者没有实现INotifyCollectionChanged接口。