Advertisement
Guest User

Untitled

a guest
Mar 27th, 2017
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. public interface IModule
  2. {
  3. /// <summary>
  4. /// Название выводимое в меню
  5. /// </summary>
  6. string Name { get; }
  7. /// <summary>
  8. /// Ссылка на вьюшку
  9. /// </summary>
  10. UserControl UserInterface { get; }
  11. /// <summary>
  12. /// Отключение текущей вьюшки, для вьюмоделей с реализацией IDisposable
  13. /// </summary>
  14. void Deactivate();
  15. }
  16.  
  17. class SeparateDemo : IModule
  18. {
  19. //наша неразлучная парочка
  20. private SeparateDemoView view;
  21. private SeparateDemoViewModel viewModel;
  22.  
  23. public string Name => "Вьюшка SeparateDemo";
  24.  
  25.  
  26. public UserControl UserInterface
  27. {
  28. get { if (view == null) CreateView(); return view; }
  29. }
  30.  
  31. private void CreateView()
  32. {
  33. //загружаем вьюшку
  34. view = new SeparateDemoView();
  35. //её вьюмодель
  36. viewModel = new SeparateDemoViewModel();
  37. //связываем их между собой
  38. view.DataContext = viewModel;
  39. }
  40.  
  41. public void Deactivate()
  42. {
  43. viewModel.Dispose();
  44. view = null;
  45. }
  46. }
  47.  
  48. <Grid>
  49. <Grid.ColumnDefinitions>
  50. <ColumnDefinition Width="180" />
  51. <ColumnDefinition Width="*" />
  52. </Grid.ColumnDefinitions>
  53. <ListBox Grid.Column="0"
  54. ItemsSource="{Binding Modules}"
  55. SelectedItem="{Binding SelectedModule, Mode=TwoWay}">
  56. <ListBox.ItemTemplate>
  57. <DataTemplate>
  58. <TextBlock Text="{Binding Name}" />
  59. </DataTemplate>
  60. </ListBox.ItemTemplate>
  61. </ListBox>
  62. <ContentPresenter x:Name="contentPresenter" Grid.Column="1"
  63. Content="{Binding UserInterface}" />
  64. </Grid>
  65.  
  66. class MainWindowViewModel : INotifyPropertyChanged
  67. {
  68. public event PropertyChangedEventHandler PropertyChanged = delegate { };
  69.  
  70. //ctor
  71. public MainWindowViewModel(IEnumerable<IModule> modules)
  72. {
  73. Modules = modules.OrderBy(m => m.Name).ToList();
  74. if (this.Modules.Count > 0)
  75. {
  76. SelectedModule = this.Modules[0];
  77. }
  78. }
  79.  
  80. //Properties
  81.  
  82. /// <summary>
  83. /// Список всех возможных загрузчиков пар View и ViewModel
  84. /// </summary>
  85. public List<IModule> Modules { get; private set; }
  86.  
  87.  
  88. /// <summary>
  89. /// Выбранная и загруженная парочка View и ViewModel
  90. /// </summary>
  91. private IModule _SelectedModule;
  92. public IModule SelectedModule
  93. {
  94. get { return _SelectedModule; }
  95. set
  96. {
  97. if (value == _SelectedModule) return;
  98. if (_SelectedModule != null) _SelectedModule.Deactivate();
  99. _SelectedModule = value;
  100. PropertyChanged(this, new PropertyChangedEventArgs(nameof(SelectedModule)));
  101. PropertyChanged(this, new PropertyChangedEventArgs("UserInterface"));
  102. }
  103. }
  104.  
  105. /// <summary>
  106. /// То, что отображает View через ContentPresenter
  107. /// </summary>
  108. public UserControl UserInterface
  109. {
  110. get
  111. {
  112. if (SelectedModule == null) return null;
  113. return SelectedModule.UserInterface;
  114. }
  115. }
  116. }
  117.  
  118. static class ReflectionHelper
  119. {
  120. public static IEnumerable<T> CreateAllInstancesOf<T>()
  121. {
  122. return typeof(ReflectionHelper).Assembly.GetTypes()
  123. .Where(t => typeof(T).IsAssignableFrom(t))
  124. .Where(t => !t.IsAbstract && t.IsClass)
  125. .Select(t => (T)Activator.CreateInstance(t));
  126. }
  127. }
  128.  
  129. public partial class App : Application
  130. {
  131. private void Application_Startup(object sender, StartupEventArgs e)
  132. {
  133. var mainWindow = new MainWindow();
  134.  
  135. var modules = ReflectionHelper.CreateAllInstancesOf<IModule>();
  136.  
  137. var vm = new MainWindowViewModel(modules);
  138. mainWindow.DataContext = vm;
  139. mainWindow.Closing += (s, args) => vm.SelectedModule.Deactivate();
  140. mainWindow.Show();
  141. }
  142. }
  143.  
  144. class FirstDemo : ModuleBase
  145. {
  146. public override string Name
  147. {
  148. get { return "Вьюшка FirstDemo"; }
  149. }
  150.  
  151. protected override UserControl CreateViewAndViewModel()
  152. {
  153. return new FirstDemoView() { DataContext = new FirstDemoViewModel() };
  154. }
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement