Читайте также:
|
|
Очевидно, что модели представления дочерних окон не могут работать сами по себе, и необходим механизм, отображающий их в настоящие дочерние окна целевой платформы (Silverlight или WPF).
Для этих целей необходимо ввести менеджер дочерних моделей представления: он ведет учет видимых в настоящий момент моделей представления и сообщает о них всем внешним слушателям, подписанным на изменения коллекции ViewModels:
1: /// <summary>
2: /// Interface of class managing closeable View Models of
3: /// the specified type
4: /// </summary>
5: public interface IChildViewModelManager
6:: ICloseableViewModelPresenter<IChildViewModel>
7: {
8: /// <summary>
9: /// Collection of managed View Models
10: /// </summary>
11: ReadOnlyObservableCollection<IChildViewModel>
12: ViewModels { get; }
13: }
Здесь используется понятие презентера закрываемой модели представления, который принимает к регистрации видимые модели представления:
1: /// <summary>
2: /// Interface of closeable View Model presenter
3: /// </summary>
4: [InheritedExport]
5: public interface ICloseableViewModelPresenter<in TViewModelBase>
6: where TViewModelBase: ICloseableViewModel
7: {
8: /// <summary>
9: /// Shows <paramref name="viewModel" />
10: /// </summary>
11: void ShowViewModel(TViewModelBase viewModel);
12: }
Реализация менеджера дочерних моделей представления принимает к регистрации видимые модели представления дочерних окон и добавляет их во внутреннюю коллекцию. Одновременно с регистрацией происходит привязка к событию Closed модели представления, по которому она снимается с регистрации в менеджере и удаляется из коллекции:
1: /// <summary>
2: /// Manages closeable View Models of the specified type
3: /// </summary>
4: internal class ChildViewModelManager
5:: IChildViewModelManager
6: {
7: // Private fields
8: private readonly ObservableCollection<IChildViewModel>
9: _viewModelsInternal =
10: new DispatchObservableCollection<IChildViewModel>();
11: private ReadOnlyObservableCollection<IChildViewModel>
12: _viewModels;
13:
14: /// <summary>
15: /// Collection of managed View Models
16: /// </summary>
17: public ReadOnlyObservableCollection<IChildViewModel>
18: ViewModels
19: {
20: get
21: {
22: return _viewModels?? (_viewModels =
23: new ReadOnlyObservableCollection<IChildViewModel>(
24: _viewModelsInternal));
25: }
26: }
27:
28: #region ICloseableViewModelPresenter<TViewModelBase> Members
29:
30: void ICloseableViewModelPresenter<IChildViewModel>
31:.ShowViewModel(IChildViewModel viewModel)
32: {
33: ShowViewModelCore(viewModel);
34: }
35:
36: #endregion
37:
38: /// <summary>
39: /// Closes <paramref name="viewModel" />
40: /// </summary>
41: protected virtual void CloseViewModelCore
42: (IChildViewModel viewModel)
43: {
44: viewModel.Closed -= OnViewModelClosed;
45:
46: Debug.Assert(_viewModelsInternal.Contains(viewModel));
47: _viewModelsInternal.Remove(viewModel);
48: }
49:
50: /// <summary>
51: /// Shows <paramref name="viewModel" />,
52: /// adding it to collection
53: /// </summary>
54: protected virtual void ShowViewModelCore
55: (IChildViewModel viewModel)
56: {
57: Debug.Assert(!viewModel.IsClosed);
58: viewModel.Closed += OnViewModelClosed;
59:
60: Debug.Assert(!_viewModelsInternal.Contains(viewModel));
61: _viewModelsInternal.Add(viewModel);
62: }
63:
64: private void OnViewModelClosed(object sender, EventArgs e)
65: {
66: Debug.Assert(sender is IChildViewModel);
67: CloseViewModelCore((IChildViewModel)sender);
68: }
69: }
Дата добавления: 2015-08-13; просмотров: 54 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Краткие итоги | | | ChildViewManager |