Нет новой строки с редактированием Datagrid после обновления ObservableCollection

У меня возникла проблема с тем, что 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 theObversableCollectionis updated. However theDataGrid` должна быть добавлена ​​новая строка после вставки новой записи, но это то, что она делает.

Это то, что он делает,

введите здесь описание изображения

Однако закомментирование этой строки CollectionLists.CalculationTableSourceCollection(CalculationTblSourceObserv, @"section", @"sectionAll"); в событии CalculationTableGrid_OnCellEditEnding позволяет корректно вести себя, и после создания новой записи добавляется пустая строка, см. ниже:

введите здесь описание изображения

Что здесь происходит, я не могу заставить это работать правильно, любая помощь будет очень признательна.


person KyloRen    schedule 08.02.2017    source источник
comment
Проблема в том, что событие CellEditEnding будет возникать при добавлении нового элемента, а затем вы немедленно очищаете его в своем методе CalculationTableSourceCollection... почему вы вообще вызываете метод CalculationTableSourceCollection в обработчике событий CellEditEnding?   -  person mm8    schedule 08.02.2017
comment
@mm8, чтобы обновить коллекцию. Я думал, вы должны обновлять каждый раз, когда что-то меняете?   -  person KyloRen    schedule 09.02.2017
comment
@ мм8, аааа, я вижу, что я сделал не так. Вы абсолютно правы!!!   -  person KyloRen    schedule 09.02.2017
comment
Значит ли это, что ваша проблема решена? Должен ли я опубликовать свой комментарий в качестве ответа?   -  person mm8    schedule 09.02.2017
comment
@ mm8, Да, ты решил мою проблему. Также не могли бы вы добавить небольшое объяснение того, что происходит с ObservableCollection<T> при вызове INotifyPropertyChanged, так как кажется, что мой метод CalculationTableSourceCollection не нужен как для добавления, так и для удаления элементов из коллекции, например, когда при вызове INotifyPropertyChanged он изменяется на коллекцию для вас . (это если я правильно понял)   -  person KyloRen    schedule 09.02.2017


Ответы (2)


Проблема здесь в том, что событие CellEditEnding будет вызвано при добавлении нового элемента, а затем вы немедленно очистите свой CalculationTableSourceCollection в своем методе CalculationTableSourceCollection.

Вам вообще не нужно вызывать метод CalculationTableSourceCollection в обработчике событий CellEditEnding.

Любой элемент, который вы добавляете или удаляете в ObservableCollection<T>, автоматически отображается в DataGrid. Это то, что отличает ObservableCollection<T> от List<T>. Последний не реализует INotifyCollectionChanged интерфейс.

person mm8    schedule 09.02.2017
comment
Почему DataGrid не обновляется при изменении содержимого ObservableCollection<T>? У меня есть ComboBox, где я меняю сотрудников, что означает, что мне нужно повторно заполнить ObservableCollection<T> запросом ссылки, однако данные DataGrid не обновляются. Нужно ли мне снова обновлять DataGrid.ItemSoruce? Посмотрите первый набор кода в моем вопросе о том, как я привязываюсь к ObservableCollection<T>. - person KyloRen; 09.02.2017
comment
Пожалуйста, задайте новый вопрос, если у вас есть другая проблема. - person mm8; 09.02.2017
comment
Готово, stackoverflow.com/questions/42135024/ - person KyloRen; 09.02.2017

Похоже, вы обновляете свойство CalculationTblSourceObserv, но ограничиваете свойство ListItems в xaml. так что либо свяжите CalculationTblSourceObserv в xaml, либо вы можете сделать следующее.

В вашем вопросе я не вижу, в какой части кода присутствует свойство «ListItems», которое является свойством, привязанным к сетке данных. Надеюсь, это в модели представления.

Таким образом, либо ваше свойство ListItems не обновляется, либо, если оно обновляется, ваш 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));
      }
  }

Далее см. ссылку: Как реализовать изменение свойства Уведомление

person Versatile    schedule 08.02.2017
comment
listItems — это столбец в таблице сервера SQL в файле LINQ to SQL. - person KyloRen; 08.02.2017
comment
@KyloRen Итак, вы вставляете эти записи в наблюдаемую коллекцию? Если да, укажите это наблюдаемое имя коллекции в xaml, как это предлагается в ответе. - person Versatile; 08.02.2017
comment
Итак, как мне обновить базу данных, используя наблюдаемую коллекцию? - person KyloRen; 08.02.2017
comment
@KyloRen Какую часть кода вы сейчас обновляете в базе данных? Тем более это отдельный вопрос. Так что, если на ваш первоначальный вопрос дан ответ, я думаю, мы в порядке. - person Versatile; 08.02.2017
comment
Использование LINQ to SQL, поэтому ListItems является свойством этого автоматически сгенерированного класса. Во всяком случае, я нашел проблему с помощью @mm8. Но я всегда голосую за тех, кто мне помог, так как ссылка была полезной. - person KyloRen; 09.02.2017