WPF路由事件:MainWindow到UserControl

时间:2016-01-26 09:12:37

标签: c# wpf vb.net viewmodel

我希望我的主窗口的视图模型告知用户控件ObservableCollection(视图模型的属性)的排序已通过事件更改。

使用共享/静态方法不是我的解决方案,因为主窗口视图模型不应该知道用户控件(它本身绑定到相同的视图模型)。

列表框控件使用ObservableCollection作为其项目的来源,此方案只是强制ScrollIntoView在列表框中。

我意识到RoutedEvents和隧道的概念,我认为这可能是我的解决方案,但我不完全确定这是否是唯一的选择。以这种方式路由对我来说是一个全新的概念。

我已经查看了this example,但我需要自定义事件,而不是现有的路由事件。

感谢。

1 个答案:

答案 0 :(得分:0)

当添加/删除项目或刷新列表时,CollectionChanged会触发

ICollectionView事件。您可以利用此事件来提升自己的自定义事件。下面的代码片段演示了在ViewModel vm的学生集合进行排序时的用法。

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            ICollectionView view = (ICollectionView)CollectionViewSource.GetDefaultView(vm.Students);
            view.CollectionChanged += view_CollectionChanged;
            view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); 
        }

        void view_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("view_CollectionChanged changed !");
        }

如果你告诉你如何在UserControl中使用ViewModel的集合属性,可以说更多。

通常,MainWindow和UserControl应该通过ICommand进行通信。

Custom Command Tutorial