2017-02-08 9 views
0

У меня возникла проблема с DataGrid, не создавая новую пустую строку после ввода новой записи.Нет новой строки с Datagrid Редактирование после обновления ObservableCollection

Возможно, это произошло после обновления 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

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

+0

Проблема в том, что событие CellEditEnding будет поднято при добавлении нового элемента, а затем вы сразу очистите его в методе CalculationTableSourceCollection ... почему вы даже вызываете метод CalculationTableSourceCollection в обработчике событий CellEditEnding? – mm8

+0

@ mm8, чтобы обновить коллекцию. Я думал, вы должны обновлять каждый раз, когда вы что-то меняете? – KyloRen

+0

@ mm8, ahhh, я вижу, что я сделал не так. Вы абсолютно правы !!! – KyloRen

ответ

1

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

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

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

+0

Почему обновление 'DataGrid' при изменении содержимого' ObservableCollection '? У меня есть «ComboBox», где я меняю «Сотрудники», что означает, что мне нужно повторно заполнить «ObservableCollection » ссылкой, однако данные DataGrid не обновляются. Нужно ли снова обновлять 'DataGrid.ItemSoruce'? См. Первый набор кода в моем вопросе о том, как я привязываюсь к 'ObservableCollection '. – KyloRen

+0

Если у вас есть другая проблема, задайте новый вопрос. – mm8

+0

Выполнено, http://stackoverflow.com/questions/42135024/change-out-observablecollection-upon-combobox-change – KyloRen

1

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

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

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

Далее сослаться на ссылку: How to: Implement Property Change Notification

+0

'listItems' - это столбец в столбце SQL-сервера в' LINQ to SQL'. – KyloRen

+0

@KyloRen Итак, вы вставляете эти записи в наблюдаемую коллекцию? Если да, то укажите это наблюдаемое имя коллекции в xaml, как указано в ответе. – Versatile

+0

Итак, как мне обновить базу данных с помощью наблюдаемой коллекции? – KyloRen

 Смежные вопросы

  • Нет связанных вопросов^_^