从代码隐藏中访问ResourceDirectory中的CollectionViewSource

时间:2018-03-28 08:33:11

标签: c# wpf xaml datagrid code-behind

我有DataGrid用户可以插入新数据。如果用户决定不继续保存新行,则取消添加,数据保持为打开记录时的状态。为了解决这个问题,我已经解决了我需要(我很确定,至少)清除网格然后刷新它。

但是,我的数据绑定到CollectionViewSource中的ResourceDictionary,而DataGrid的ItemsSource是该CVS的属性,我无法在代码中找到它-behind。

xaml:

<Window.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="../AllStyles.xaml" />
      <ResourceDictionary Source="AuditCollectionSource.xaml" />
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Window.Resources>

<DataGrid Grid.Row="1" Name="dgridManagementIssues" AutoGenerateColumns="False" 
    ItemsSource="{Binding Path=AuditManagementIssues, Mode=TwoWay}" >
  <DataGrid.Columns>
    ...

  <Button Name="btnCancel" Content="Cancel" Click="btnCancel_Click" />

因此,当单击取消按钮时,我从DataGrid获取ItemsSource并清除它。然后我想将其设置为'AuditManagementIssues'ItemsSource

CS:

private void btnCancel_Click(object sender, RoutedEventArgs e)
{
    // clear the grid
    ObservableCollection<AuditManagementIssue> issues = new ObservableCollection<AuditManagementIssue>();
    dgridManagementIssues.ItemsSource = issues;
    issues.Clear();
    // repopulate the grid
// reload the model?
    lGFinanceEntities.Entry<AuditStatement>(currentAuditStatement).Reload();
    dgridManagementIssues.ItemsSource = AuditManagementIssues;  <-- can't do this
}

intellisense告诉我当前上下文中不存在名称“AuditManagementIssues”。

当窗口关闭并再次打开时,所有数据都应该是它所在的位置。

那么,如何从代码隐藏中刷新/重新加载数据呢?或者,是否有更好的方法可以删除已输入但未保存到DataGrid的项目。

2 个答案:

答案 0 :(得分:0)

逻辑上,AuditManagementIssues在当前上下文中不存在,因为它在Path中为Binding。因此,您可以再次为Binding ItemsSource设置dgridManagementIssues

BindingOperations.SetBinding(dgridManagementIssues, DataGrid.ItemsSourceProperty, new Binding("AuditManagementIssues") { Mode = BindingMode.TwoWay });

如果未将ItemsSource设置为新值,则可以从后面的代码更新bindig:

BindingOperations.GetBindingExpression(dgridManagementIssues, DataGrid.ItemsSourceProperty)?.UpdateTarget();

答案 1 :(得分:0)

使用您的代码,您可以确保您绑定到CollectionView而不仅仅是CollectionViewSource。 CollectionView有一个Refresh方法。 https://msdn.microsoft.com/en-us/library/system.windows.data.collectionview.refresh(v=vs.110).aspx

你可以从一个窗口的资源中获取一个collectionviewsource并获取它的默认视图,然后使用以下代码刷新它:

CollectionViewSource cvs = this.Resources["AuditManagementIssues"] as CollectionViewSource;
var lcv = (ListCollectionView)CollectionViewSource.GetDefaultView(cvs);
lcv.Refresh();