データ グリッドを使用して DbSet (Entity Framework 5) を表示するアプリケーションがあります。コードを使用して一部のエンティティを変更すると、エンドユーザーは何らかのアクション (列の並べ替えやセルの編集など) を実行してデータグリッドを更新する必要があります。
XAML:
<CollectionViewSource x:Key="componentViewSource" d:DesignSource="{d:DesignInstance {x:Type Models:Component}, CreateList=True}"/>
<TabItem Header="Components">
<DataGrid x:Name="componentDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True"
ItemsSource="{Binding Source={StaticResource componentViewSource}}" RowDetailsVisibilityMode="VisibleWhenSelected">
<DataGrid.Columns>
<DataGridTextColumn x:Name="componentTypeColumn" Binding="{Binding ComponentType}" Header="Component Type" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="descriptionColumn1" Binding="{Binding Description}" Header="Description" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="catalogNumberColumn1" Binding="{Binding CatalogNumber}" Header="Catalog Number" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="commentColumn1" Binding="{Binding Comment}" Header="Comment" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="digiKeyColumn" Binding="{Binding DigiKey}" Header="Digi Key" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="farnellColumn" Binding="{Binding Farnell}" Header="Farnell" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="inStockColumn" Binding="{Binding InStock}" Header="In Stock" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="minimumStockColumn" Binding="{Binding MinimumStock}" Header="Minimum Stock" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="manufacturerColumn" Binding="{Binding Manufacturer}" Header="Manufacturer" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="manufacturerPNColumn" Binding="{Binding ManufacturerPN}" Header="Manufacturer PN" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="mouserColumn" Binding="{Binding Mouser}" Header="Mouser" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="packageColumn" Binding="{Binding Package}" Header="Package" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="priceColumn" Binding="{Binding Price}" Header="Price" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="subTotalColumn" Binding="{Binding SubTotal}" Header="Sub Total" IsReadOnly="True" Width="SizeToHeader"/>
<DataGridTextColumn x:Name="valueColumn" Binding="{Binding Value}" Header="Value" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</TabItem>
C#:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// That's a private field.
componentViewSource = (CollectionViewSource)FindResource("componentViewSource");
// That's the database context.
db = new PotatoContext();
db.Components.Load();
componentViewSource.Source = db.Components.Local;
}
private void Manufacture_Product_Click(object sender, RoutedEventArgs e)
{
var product = productDataGrid.SelectedItem as Product;
if(product == null)
return;
ManufactureProduct d = new ManufactureProduct(product, db);
d.Owner = this;
d.ShowDialog();
if (d.DialogResult ?? false)
{
foreach (var comp in product.Components)
{
comp.Component.InStock -= comp.Quantity * d.NumberOfUnits;
}
db.SaveChanges();
var fileName = string.Format("{0}{1}{2}{3}.txt", ReportGenerator.ProductReportsFolder,
System.IO.Path.DirectorySeparatorChar, product.Name, DateTime.Now.ToString("d.MMM.yyyy HH.mm"));
using(var file = File.Create(fileName))
{
ReportGenerator.GenerateProductionReport(file, product, d.NumberOfUnits);
}
}
}
2 番目のイベント ハンドラー内の foreach ループで、コンポーネント (既に PotatoContext の一部になっている) のプロパティを変更し、コンテキストを保存します。
データ グリッドを見ると、古い値がまだ保持されているため、一部のセルで編集モードに入って特定のセルを更新するか、列ヘッダーをクリックしてすべてのセルを更新する必要があります。
知らないユーザーはそうするのを知らないかもしれないので、これは私を悩ませます。コードからコンポーネントを更新するにはどうすればよいですか? ( Grid.Items.Refresh(); を試しました)