WPF datagrid多个窗口问题

时间:2009-11-25 10:54:15

标签: wpf datagrid window

我有一个场景,我在数据网格中加载ICollectionView。

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

现在问题是,我有时会使用以下方式打开一个新窗口:

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

问题是,我也使用这个新窗口编辑数据。现在,我希望在关闭第二个窗口后刷新第一个窗口中的datagrid(实际上,只要它被刷新,它并不重要。)

我该怎么做?

2 个答案:

答案 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,你用户Obs​​ervableCollection< T>与使用List< T>。

的方式相同

因此,只需绑定到ObservableCollection,WPF就会自动检测对象何时更改或何时添加或删除。

ICollectionView非常有用,它在真正的集合之上添加了对当前项目,排序,过滤和分组的支持,如果该集合是ObservableCollection,那么一切都会正常工作,所以代码:

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

将为您提供支持自动更改通知的集合视图。