我有一个绑定到viewsource的DataGrid,如下所示:
public OrderProcessingEntities ctx = new OrderProcessingEntities();
private CollectionViewSource customerViewSource;
public CustomersDataSheet()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
customerViewSource = ((CollectionViewSource) this.FindResource("customerViewSource")));
ctx.Customers.Load();
customerViewSource.Source = ctx.Customers.Local;
}
DataGrid上的每条记录都有一个按钮,可以打开另一个表单(EditForm.ShowDialog()
)来编辑该记录。
编辑表单与其具有DataGrid的父表单具有自己的连接。
用户可以保存或取消。如果他保存,我使用ctx.SaveChanges()
将更改保存到数据库(Sql Server)。
我需要做什么,以便使用更新的数据刷新DataGrid。
我可以在EditForm关闭时执行此操作,但我不希望更改DataGrid的行位置。
答案 0 :(得分:0)
这是我要做的。
你需要一个INotify类让Datagrid知道你的源已被更改,这是我使用的。
public class CommonBase:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
现在我为具有datagrid的页面创建一个ViewModel,此视图模型将具有如下所示的CustomerViewSource。我称之为CustomerView。您想从我们上面创建的CommonBase类继承。可以使用CollectionViewSource或ObservableCollection。
public class CustomerView: CommonBase
{
private CollectionViewSource _CustomerViewSource;
public CollectionViewSource CustomerViewSource
{
get { return _CustomerViewSource; }
set { _CustomerViewSource = value; NotifyPropertyChanged("CustomerViewSource"); }
}
public void GetCustomers()
{
CustomerView = new CollectionViewSource()
//YOUR CODE HERE TO POPULATE CustomerView
}
}
在您的XAML中,使用以下代码设置DataContext。 "的ViewModels"在我的项目中,我只是拥有CustomerView的文件夹。
<DataGrid.DataContext>
<ViewModels:CustomerView x:Name="CustomerView"></ViewModels:CustomerView>
</DataGrid.DataContext>
并将XAML中的DataGrid项目源设置为我们的ViewSource
ItemsSource="{Binding CustomerViewSource}
现在,当您填充网格或表单加载时,在您的代码中,您将会这样。这将填充列表并更新网格。现在无论何时将List添加到其他内容中,网格都会刷新。
CustomerView.GetCustomers();