2009-11-25 108 views
1

我有一个场景,我加载一个数据网格ICollectionView。WPF datagrid多窗口问题

在某些情况下,我修改collectionview从中获取数据的数据。例如,如果我以configGrid.ItemsSource = configData;重新加载网格,则数据会被更新。

现在的事情是,我有时用打开一个新窗口:

var newWindow = new Edit(movie); 
newWindow.Show(); 

的事情是,我也是用这个新窗口中编辑数据。现在,我想在关闭第二个窗口后刷新第一个窗口中的数据网格(实际上,它刷新时无关紧要,只要这样做)。

我该怎么做?

回答

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; 
    } 
+0

这似乎不起作用,事件不会被触发,如果我关闭新窗口 – WtFudgE

+0

哦。我不明白为什么上面的代码不起作用 - 我只是将它打成了一个虚拟程序,事件得到了很好的提升。它看起来像你使用VB(我不熟悉),而不是C#,所以这可能是一个问题,我想(尽管我希望事件处理在两种语言中都是相似的)。你是否有应该与打开或关闭窗口进行交互的代码? – MoominTroll

+0

哦,我好像刚刚把代码放在一个错误的窗口中:P 它工作正常,我很抱歉! 这不是vb btw :) – WtFudgE

0

如果ICollectionView背后的集合支持INotifyCollectionChanged(如ObservableCollection)和对象本身支持INotifyPropertyChanged那么,网格应该自动更新

否则,你是你自己和编辑窗口应该提出一些排序的通知(可能是一个事件),您应该接收并更新列表。

好吧,这里的长版本:

WPF数据绑定可以自动更新的用户界面 - 但它需要知道的东西,为了改变触发更新,要做到这一点最简单的方法是支持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"); 
     } 
    } 
} 

现在,当您绑定到MOVI e类并更改Name属性,UI将自动更新。

下一步就是处理电影的对象列表,我们这样做,通过使用集合类的工具INotifyCollectionChanged,幸运的是我们有已经写入框架调用的ObservableCollection一个,你的用户的ObservableCollection <牛逼>以同样的方式你可以使用列表<T>。

所以,只需绑定到ObservableCollection,WPF将自动检测对象何时更改或何时添加或删除。

ICollectionView是非常有用的,它增加了对当前项目,排序,过滤,并在真实采集的顶部分组,如果该集合是一个ObservableCollection一切都将只是工作,所以代码:

ObservableCollection<Movie> movies = new ObservableCollection<Movie>(); 
ICollectionView view = CollectionViewSource.GetDefaultView(movies); 

会给你一个支持自动更改通知的集合视图。

+0

我对所有这些数据绑定技术并不是很熟悉,所以也许我应该使用其他方法而不是ICollectionView? – WtFudgE

+0

我已经更新了我的答案,包括了使用这些技术所需的所有详细信息,希望这有助于您。 – Nir

+0

谢谢,它必须调整一下,但我得到它的工作:) – WtFudgE