2016-01-26 5 views
1

Я хочу, чтобы модель представления моего основного окна информировала пользовательский элемент управления о том, что сортировка ObservableCollection (свойство модели представления) изменилась через событие.WPF Маршрутизированное событие: MainWindow to UserControl

Использование общего/статического метода не является моим решением, так как модель основного окна не должна знать о пользовательском элементе управления (который сам привязан к одной и той же модели представления).

Элемент управления списком использует ObservableCollection в качестве источника для своих элементов, и этот сценарий - просто заставить ScrollIntoView в списке.

Я знаю концепцию RoutedEvents и туннелирование, которое, я думаю, может быть моим решением, но я не совсем уверен, что это единственный вариант. Маршрутизация таким образом - совершенно новая концепция для меня.

Я просмотрел this example, но мне нужны специальные события, предположительно, в отличие от существующих событий маршрутизации.

Спасибо.

ответ

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 !"); 
     } 

Подробнее можно сказать, если вы расскажете, как вы используете свойство коллекции ViewModel в вашем UserControl.

Обычно MainWindow и UserControls должны взаимодействовать через ICommand.

Custom Command Tutorial

+0

Благодарим вас за комментарий. В этом случае ObservableCollection не изменяется. Я просто использую меню на MainWindow для сортировки указанного ObservableCollection с помощью: ListCollectionView.SortDescriptions.Add() После этого я хочу заставить свой пользовательский элемент управления использовать ScrollIntoView. – miriyo

+0

Прежде всего, вам не следует сортировать коллекцию в MainWindow, вместо этого сам UserControl должен отвечать на меню. приведенный выше код может быть использован как и для 'ListBox.ItemsSource':' ICollectionView view = (ICollectionView) CollectionViewSource.GetDefaultView (myListBox.ItemsSource); ' – AnjumSKhan

+0

Помимо того, что сбор должен быть отсортирован, я все еще не вижу, как мой UserControl знает о событии, произошедшем в MainWindow. – miriyo