2017-02-08 10 views
0

DataGridに新しいレコードが入力された後に新しい空の行が作成されないという問題が発生しました。ObservableCollectionの更新後にDatagrid編集で新しい行がありません

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です::

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>を更新するための私のコードです

<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

しかし、CalculationTableGrid_OnCellEditEndingイベントでこの行CollectionLists.CalculationTableSourceCollection(CalculationTblSourceObserv, @"section", @"sectionAll");をコメントアウトすると、新しいレコードが行われた後、それが正しく動作するように、空の行が追加されることができ、以下を参照してください:

enter image description here

ここで何が起きているのか、私はこれが正常に動作しない場合は、任意の助けもいただければ幸いです。

+0

問題は、新しい項目が追加されたときにCellEditEndingイベントが発生し、CalculationTableSourceCollectionメソッドですぐにクリアされるということです。なぜCellEditEndingイベントハンドラのCalculationTableSourceCollectionメソッドを呼び出していますか? – mm8

+0

@ mm8、コレクションを更新します。私はあなたが何かを変えるたびにあなたが更新されるはずだったと思った? – KyloRen

+0

@ mm8、ああ、私が間違っていたのを見る。あなたは絶対に正しいです! – KyloRen

答えて

1

問題は、新しいアイテムが追加されたときCellEditEndingイベントが発生するということですこれは、次のように行うことができますプロパティ変更イベントを上げる介して行われますCalculationTableSourceCollectionメソッドですぐにCalculationTableSourceCollectionをクリアしてください。

CellEditEndingイベントハンドラでは、CalculationTableSourceCollectionメソッドを呼び出す必要はありません。

ObservableCollection<T>に追加または削除したアイテムはすべて自動的にDataGridに表示されます。これは、List<T>とは異なるObservableCollection<T>を作成するものです。後者はINotifyCollectionChangedインターフェイスを実装していません。

+0

'ObservableCollection 'のコンテンツを変更するときに 'DataGrid'が更新されないのはなぜですか?私はスタッフメンバーを変更する 'ComboBox'を持っています。つまり、' ObservableCollection 'にリンククエリを再設定する必要がありますが、' DataGrid'データは更新されません。 'DataGrid.ItemSoruce'をもう一度更新する必要がありますか?私がObservableCollection にどのようにバインドしているかについての私の質問の最初のコードセットを見てください。 – KyloRen

+0

別の問題がある場合は、新しい質問をしてください。 – mm8

+0

完了、http://stackoverflow.com/questions/42135024/change-out-observablecollection-upon-combobox-change – KyloRen

1

プロパティCalculationTblSourceObservを更新していますが、xamlにはListItemsというプロパティがバインドされているようです。 xamlにCalculationTblSourceObservをバインドするか、次の操作を行うことができます。

あなたの質問では、どの部分のコードがデータグリッドにバインドされたプロパティである '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)); 
     } 
    } 

はまた、リンクを参照してください:ここHow to: Implement Property Change Notification

+0

'listItems'は' LINQ to SQL'のSQLサーバーテーブルの列です。 – KyloRen

+0

@KyloRenそう、これらのレコードをobservableコレクションに挿入していますか?はいの場合は、xamlに観測可能なコレクション名を指定します。 – Versatile

+0

したがって、observableコレクションを使用してデータベースを更新するにはどうすればよいですか? – KyloRen

関連する問題