私は自分のDataGridをリフレッシュする際に問題があります。 Entity Frameworkに接続された新しいクライアントを作成する簡単なアプリケーションを用意してください。 新しいボタンを作成し、変更を保存して削除する3つのボタンがあります。最初の2つはうまくいっていますが、選択した行を削除することで問題はほとんどありません。 削除ボタンをクリックすると、オブジェクトはデータベースから削除されますが、DataGridは更新されません。 .Items.Resfresh()を使用しようとしました。先頭からItemSourceをロードし、選択した行を削除しましたが、いくつかの例外がキャッチされました。データベースからデータを削除しますが、データグリッドからは削除しません。 WPF
f.e. (ItemsSourceが使用されている間、操作は無効です。)代わりにItemsControl.ItemsSourceを使用して要素にアクセスして変更してください。
ObservableCollectionを実装する必要がありますか?
C#
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
_isLoading = true;
clientDataGrid.ItemsSource = _repo.ClientsListInMemory();
_clientViewSource = (ObjectDataProvider)FindResource("clientViewSource");
_isLoading = false;
clientDataGrid.SelectedIndex = 0;
}
private void deleteBtn_Click(object sender, RoutedEventArgs e)
{
HotelContext db = new HotelContext();
Client client = clientDataGrid.SelectedItem as Client;
try
{
_currentClient = db.Clients.Where(c => c.Id == client.Id).Single();
db.Clients.Remove(_currentClient);
db.SaveChanges();
// refreshFunction()?
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
XAML
<UserControl.Resources>
<ObjectDataProvider x:Key="clientViewSource"/>
</UserControl.Resources>
<DataGrid x:Name="clientDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" IsReadOnly="True" ItemsSource="{Binding Source={StaticResource clientViewSource}}" Margin="0,10,323,0" RowDetailsVisibilityMode="VisibleWhenSelected" SelectionChanged="clientDataGrid_SelectionChanged" SelectedValuePath="Id" Height="200" VerticalAlignment="Top">
<DataGrid.Columns>
<DataGridTextColumn x:Name="Id" Binding="{Binding Id}" Header="Id" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding FirstName}" Header="First Name" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding LastName}" Header="Last Name" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="phoneNumberColumn" Binding="{Binding PhoneNumber}" Header="Phone Number" Width="SizeToHeader"/>
</DataGrid.Columns>
</DataGrid>
基本コレクションから手動で削除できます。 '((List)clientDataGrid.ItemsSource).Remove(_currentClient);' –
Fabio