Tidak ada baris baru dengan Pengeditan Datagrid setelah memperbarui ObservableCollection

Saya mengalami masalah dengan DataGrid tidak membuat baris kosong baru setelah catatan baru dimasukkan.

Tampaknya hanya terjadi setelah memperbarui ObversableCollection<T>.

Saya menggunakan ini untuk mengikat ke koleksi:

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>();
}

Ini kode saya untuk memperbarui ObversableCollection<T> saya:

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);
            }
        }
    }
}

Dan ini XAMLnya:

<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>

Dan saya menggunakan metode ini untuk memperbarui dataGrid:

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

Jadi semuanya berfungsi dengan baik, DataGrid' is updated, the database is correctly updated and theObversableCollectionis updated. However theDataGrid` harus ditambahkan baris baru setelah catatan baru dimasukkan, tetapi inilah fungsinya.

Inilah yang dilakukannya,

masukkan deskripsi gambar di sini

Namun, mengomentari baris CollectionLists.CalculationTableSourceCollection(CalculationTblSourceObserv, @"section", @"sectionAll"); ini di acara CalculationTableGrid_OnCellEditEnding memungkinkannya berperilaku dengan benar dan baris kosong ditambahkan setelah rekor baru dibuat, lihat di bawah:

masukkan deskripsi gambar di sini

Apa yang terjadi di sini, saya tidak dapat menjalankannya dengan benar, bantuan apa pun akan sangat kami hargai.


person KyloRen    schedule 08.02.2017    source sumber
comment
Masalahnya adalah acara CellEditEnding akan dimunculkan ketika item baru ditambahkan dan kemudian Anda segera menghapusnya di metode CalculationTableSourceCollection Anda...mengapa Anda bahkan memanggil metode CalculationTableSourceCollection di event handler CellEditEnding?   -  person mm8    schedule 08.02.2017
comment
@mm8, untuk memperbarui koleksi. Saya pikir Anda harus memperbarui setiap kali Anda mengubah sesuatu?   -  person KyloRen    schedule 09.02.2017
comment
@ mm8, ahhh, saya melihat kesalahan yang saya lakukan. Anda benar sekali!!!   -  person KyloRen    schedule 09.02.2017
comment
Apakah itu berarti masalah Anda telah teratasi? Haruskah saya memposting komentar saya sebagai jawaban?   -  person mm8    schedule 09.02.2017
comment
@ mm8, Ya, Anda memecahkan masalah saya. Bisakah Anda menambahkan sedikit penjelasan tentang apa yang terjadi dengan ObservableCollection<T> ketika INotifyPropertyChanged dipanggil, karena tampaknya metode saya CalculationTableSourceCollection tidak diperlukan untuk menambah dan menghapus item dari koleksi, seperti ketika INotifyPropertyChanged dipanggil, itu berubah ke koleksi untuk Anda . (Itu jika pemahaman saya benar)   -  person KyloRen    schedule 09.02.2017


Jawaban (2)


Masalahnya di sini adalah acara CellEditEnding akan dimunculkan ketika item baru ditambahkan dan kemudian Anda segera menghapus CalculationTableSourceCollection di metode CalculationTableSourceCollection Anda.

Anda tidak perlu memanggil metode CalculationTableSourceCollection di event handler CellEditEnding sama sekali.

Item apa pun yang Anda tambahkan atau hapus ke ObservableCollection<T> akan otomatis muncul di DataGrid. Inilah yang membuat ObservableCollection<T> berbeda dari List<T>. Yang terakhir tidak mengimplementasikan antarmuka INotifyCollectionChanged.

person mm8    schedule 09.02.2017
comment
Mengapa DataGrid tidak diperbarui saat mengubah konten ObservableCollection<T>? Saya memiliki ComboBox tempat saya mengubah anggota Staf, yang berarti saya harus mengisi kembali ObservableCollection<T> dengan kueri tautan, namun data DataGrid tidak diperbarui. Apakah saya perlu memperbarui DataGrid.ItemSoruce lagi? Lihat kumpulan kode pertama dalam pertanyaan saya tentang bagaimana saya mengikat ke ObservableCollection<T>. - person KyloRen; 09.02.2017
comment
Silakan ajukan pertanyaan baru jika Anda memiliki masalah lain. - person mm8; 09.02.2017
comment
Selesai, stackoverflow.com/questions/42135024/ - person KyloRen; 09.02.2017

Sepertinya Anda memperbarui properti CalculationTblSourceObserv tetapi Anda telah membatasi properti ListItems di xaml. jadi ikat CalculationTblSourceObserv di xaml atau Anda dapat melakukan hal berikut.

Dalam pertanyaan Anda, saya tidak dapat melihat bagian kode mana yang menampilkan properti 'ListItems', yang merupakan properti yang diikat ke datagrid. Mudah-mudahan ini ada dalam model tampilan.

Jadi properti 'ListItems' Anda tidak diperbarui atau jika diperbarui maka xaml Anda tidak diberi tahu tentang perubahan itu. Kode model tampilan Anda harus memberi tahu xaml bahwa properti telah diperbarui. Hal ini dilakukan melalui acara Meningkatkan properti yang diubah yang dapat dilakukan seperti ini:

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));
      }
  }

Lihat lebih lanjut tautan: Cara: Menerapkan Perubahan Properti Pemberitahuan

person Versatile    schedule 08.02.2017
comment
listItems adalah kolom dalam tabel SQL server di LINQ to SQL. - person KyloRen; 08.02.2017
comment
@KyloRen Jadi, apakah Anda memasukkan catatan-catatan itu ke dalam koleksi yang dapat diamati? Jika ya, tentukan nama koleksi yang dapat diamati di xaml seperti yang disarankan dalam jawaban. - person Versatile; 08.02.2017
comment
Jadi bagaimana cara memperbarui database menggunakan koleksi yang dapat diamati? - person KyloRen; 08.02.2017
comment
@KyloRen Bagian kode mana yang Anda perbarui databasenya sekarang? Apalagi itu adalah pertanyaan terpisah. Jadi jika pertanyaan awal Anda terjawab maka saya rasa kami baik-baik saja. - person Versatile; 08.02.2017
comment
Menggunakan LINQ ke SQL, jadi ListItems adalah properti dari kelas yang dibuat secara otomatis. Bagaimanapun, saya menemukan masalah dengan bantuan @ mm8. Tapi saya selalu memilih mereka yang membantu saya karena tautannya bermanfaat. - person KyloRen; 09.02.2017