それは私が得る完全なエラーメッセージです:
System.Windows.Data Error: 8 : Cannot save value from target back to source. BindingExpression:Path=SelectedPupil; DataItem='AdministrationViewModel' (HashCode=52357250); target element is 'DataGrid' (Name=''); target property is 'SelectedItem' (type 'Object') NullReferenceException:'System.NullReferenceException
このエラーは、生徒リストデータグリッドで選択した生徒をクリックまたは選択して、学校のクラスを含むリストボックスに入れると常に発生します。
これは、リポジトリの読み込み方法を Eager ローディングから Lazy ローディングに変更したときに発生し始めました。
SelectedSchoolclass が変更された後、それに応じた生徒をロードします
生徒リストView.xaml:
<DataGrid
Grid.Row="1"
IsReadOnly="True"
HeadersVisibility="Column"
SelectedItem="{Binding SelectedPupil}"
ItemsSource="{Binding Path=SelectedSchoolclass.PupilListViewModel}"
AutoGenerateColumns="False"
>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding FirstName}" Width="*" Header="Firstname" />
<DataGridTextColumn Binding="{Binding LastName}" Width="*" Header="Last name" />
</DataGrid.Columns>
</DataGrid
ここで、ItemSource は、選択された学校のクラスのすべての生徒に設定されます。IsSynchronizedItem は必要ありません。親エンティティの ID を介した新しい遅延読み込みエンティティのため、実際には集計データがないためです。
管理ビューモデル:
public PupilViewModel SelectedPupil
{
get { return _selectedPupil; }
set
{
_selectedPupil = value;
this.RaisePropertyChanged("SelectedPupil");
GetDocumentsForPupil();
}
}
private void GetDocumentsForPupil()
{
var documentsOC = new ObservableCollection<Document>(_docRepo.GetDocumentsByPupilId(_selectedPupil.Id));
SelectedPupil.Documents.DocumentList = documentsOC;
}
問題は次のとおりだと思います。
選択したドキュメントまたは生徒からジャンプして、生徒のいない学校のクラスを選択すると、ObservableCollection が遅延して作成されるため、データベースからデータを取得する場合にのみ、PupilListViewModel_Collection が NULL になるため、NULL にバインドされます。
まあ、私は遅延読み込みに固執したいと思います.DataGrid_ItemsSource=SchoolclassList/PupilListのような階層をバインドする必要はありません.Eager読み込みに使用したものです。
どうすればその例外を取り除くことができますか?