刷新CollectionViewSource(实体框架)绑定控件

时间:2010-09-15 09:55:01

标签: .net wpf entity-framework binding

我无法相信我找不到答案...

  1. 我创建了从DB(SQL Server CE)生成的实体框架模型
  2. 我将一个实体从数据源拖到我的MainWindow,自动创建这个XAML:

    <Window.Resources> <CollectionViewSource x:Key="contentItemsViewSource" d:DesignSource="{d:DesignInstance my:ContentItem, CreateList=True}" /> </Window.Resources> <Grid DataContext="{StaticResource contentItemsViewSource}"> <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="Auto" HorizontalAlignment="Stretch" ItemsSource="{Binding}" Margin="0,22" Name="contentItemsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Stretch" Width="Auto" DataContext="{Binding}" IsReadOnly="True" CanUserResizeRows="False"> <DataGrid.Columns> <DataGridTextColumn x:Name="idColumn" Binding="{Binding Path=Id}" Header="Id" Width="SizeToHeader" Visibility="Hidden" /> <DataGridTextColumn x:Name="filePathColumn" Binding="{Binding Path=FilePath}" Header="File Path" Width="SizeToCells" /> <DataGridTextColumn x:Name="fileSizeColumn" Binding="{Binding Path=FileSize}" Header="File Size" Width="SizeToHeader" /> </DataGrid.Columns> </DataGrid> </Grid>

  3. (原谅XML格式,代码按钮似乎无法使用它。)

    我正在使用以下代码加载数据:

    foreach (String file in files.FileNames)
    {
      ContentItem c = new ContentItem() { Id = Guid.NewGuid(), FilePath = file, FileSize = (Int32)finfo.Length };
      db.AddToContentItems(c);
    }
    db.SaveChanges();
    

    这一切都有效,除了我需要更新数据网格。我能找到的唯一方法就是重新使用将实体绑定到datagrid时创建的一些自动代码:

    System.Windows.Data.CollectionViewSource contentItemsViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("contentItemsViewSource")));
    System.Data.Objects.ObjectQuery<SwordfishWPF.ContentItem> contentItemsQuery = this.GetContentItemsQuery(db);
    contentItemsViewSource.Source = contentItemsQuery.Execute(System.Data.Objects.MergeOption.AppendOnly);
    

    当然有一种更简单的方法吗? datagrid.Items.Refresh()不起作用。

1 个答案:

答案 0 :(得分:1)

你试过这个吗?

CollectionViewSource.GetDefaultView(datagrid.ItemsSource).Refresh();