ไม่มีแถวใหม่ที่มีการแก้ไข 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
@ mm8 อ่า ฉันเห็นสิ่งที่ฉันทำผิด คุณพูดถูกจริงๆ!!!   -  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' อยู่ ซึ่งเป็นคุณสมบัติที่ผูกกับ 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));
      }
  }

โปรดดูลิงก์เพิ่มเติม: วิธีการ: นำการเปลี่ยนแปลงคุณสมบัติไปใช้ การแจ้งเตือน

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 กับ SQL ดังนั้น ListItems จึงเป็นคุณสมบัติของคลาสที่สร้างขึ้นอัตโนมัตินั้น อย่างไรก็ตาม ฉันพบปัญหากับ @mm8 help แต่ฉันมักจะโหวตผู้ที่ช่วยเหลือฉันเสมอเพราะลิงก์นี้มีประโยชน์ - person KyloRen; 09.02.2017