我有一个场景,我在数据网格中加载ICollectionView。
在某些情况下,我会修改collectionview从中获取数据的数据。如果我然后用configGrid.ItemsSource = configData;
重新加载网格,则数据会更新。
现在问题是,我有时会使用以下方式打开一个新窗口:
var newWindow = new Edit(movie);
newWindow.Show();
问题是,我也使用这个新窗口编辑数据。现在,我希望在关闭第二个窗口后刷新第一个窗口中的datagrid(实际上,只要它被刷新,它并不重要。)
我该怎么做?
答案 0 :(得分:1)
我可能在这里遗漏了一些东西(遗憾的是我有一个令人沮丧的宿醉)但是你不能处理newWindow的窗口关闭事件并刷新confiGrids itemsource吗?
Window newWindow = new Window();
newWindow.Closed += new EventHandler(newWindow_Closed);
newWindow.Show();
void newWindow_Closed(object sender, EventArgs e)
{
configGrid.ItemsSource = configData;
}
答案 1 :(得分:0)
如果ICollectionView
后面的集合支持INotifyCollectionChanged
(如ObservableCollection
)并且对象本身支持INotifyPropertyChanged
,那么网格应该自动更新
否则你是独立的,编辑窗口应该提出你应该收到的某种通知(可能是一个事件)并更新列表。
好的,这是长版:
WPF数据绑定可以自动更新UI - 但它需要知道某些内容发生了变化才能触发更新,最简单的方法是支持INotifyPropertyChanged,让我们创建简单的类:
public class Movie
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
现在,让我们添加INotifyPropertyChanged支持:
public class Movie : INotifyPropertyChanged
{
public event PropertyChanged;
protected virtual OnPropertyChanged(string property)
{
var ev = PropertyChanged;
if(ev!=null)
{
ev(this, new PropertyChangedEventArgs(property));
}
}
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged("Name");
}
}
}
现在,当您绑定到影片类并更改Name属性时,UI将自动更新。
下一步是处理一个Movie对象列表,我们通过使用一个实现INotifyCollectionChanged的集合类来实现,幸运的是我们已经在框架中编写了一个名为ObservableCollection,你用户ObservableCollection< T>与使用List< T>。
的方式相同因此,只需绑定到ObservableCollection,WPF就会自动检测对象何时更改或何时添加或删除。
ICollectionView非常有用,它在真正的集合之上添加了对当前项目,排序,过滤和分组的支持,如果该集合是ObservableCollection,那么一切都会正常工作,所以代码:
ObservableCollection<Movie> movies = new ObservableCollection<Movie>();
ICollectionView view = CollectionViewSource.GetDefaultView(movies);
将为您提供支持自动更改通知的集合视图。