Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public interface IModule
- {
- /// <summary>
- /// Название выводимое в меню
- /// </summary>
- string Name { get; }
- /// <summary>
- /// Ссылка на вьюшку
- /// </summary>
- UserControl UserInterface { get; }
- /// <summary>
- /// Отключение текущей вьюшки, для вьюмоделей с реализацией IDisposable
- /// </summary>
- void Deactivate();
- }
- class SeparateDemo : IModule
- {
- //наша неразлучная парочка
- private SeparateDemoView view;
- private SeparateDemoViewModel viewModel;
- public string Name => "Вьюшка SeparateDemo";
- public UserControl UserInterface
- {
- get { if (view == null) CreateView(); return view; }
- }
- private void CreateView()
- {
- //загружаем вьюшку
- view = new SeparateDemoView();
- //её вьюмодель
- viewModel = new SeparateDemoViewModel();
- //связываем их между собой
- view.DataContext = viewModel;
- }
- public void Deactivate()
- {
- viewModel.Dispose();
- view = null;
- }
- }
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="180" />
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <ListBox Grid.Column="0"
- ItemsSource="{Binding Modules}"
- SelectedItem="{Binding SelectedModule, Mode=TwoWay}">
- <ListBox.ItemTemplate>
- <DataTemplate>
- <TextBlock Text="{Binding Name}" />
- </DataTemplate>
- </ListBox.ItemTemplate>
- </ListBox>
- <ContentPresenter x:Name="contentPresenter" Grid.Column="1"
- Content="{Binding UserInterface}" />
- </Grid>
- class MainWindowViewModel : INotifyPropertyChanged
- {
- public event PropertyChangedEventHandler PropertyChanged = delegate { };
- //ctor
- public MainWindowViewModel(IEnumerable<IModule> modules)
- {
- Modules = modules.OrderBy(m => m.Name).ToList();
- if (this.Modules.Count > 0)
- {
- SelectedModule = this.Modules[0];
- }
- }
- //Properties
- /// <summary>
- /// Список всех возможных загрузчиков пар View и ViewModel
- /// </summary>
- public List<IModule> Modules { get; private set; }
- /// <summary>
- /// Выбранная и загруженная парочка View и ViewModel
- /// </summary>
- private IModule _SelectedModule;
- public IModule SelectedModule
- {
- get { return _SelectedModule; }
- set
- {
- if (value == _SelectedModule) return;
- if (_SelectedModule != null) _SelectedModule.Deactivate();
- _SelectedModule = value;
- PropertyChanged(this, new PropertyChangedEventArgs(nameof(SelectedModule)));
- PropertyChanged(this, new PropertyChangedEventArgs("UserInterface"));
- }
- }
- /// <summary>
- /// То, что отображает View через ContentPresenter
- /// </summary>
- public UserControl UserInterface
- {
- get
- {
- if (SelectedModule == null) return null;
- return SelectedModule.UserInterface;
- }
- }
- }
- static class ReflectionHelper
- {
- public static IEnumerable<T> CreateAllInstancesOf<T>()
- {
- return typeof(ReflectionHelper).Assembly.GetTypes()
- .Where(t => typeof(T).IsAssignableFrom(t))
- .Where(t => !t.IsAbstract && t.IsClass)
- .Select(t => (T)Activator.CreateInstance(t));
- }
- }
- public partial class App : Application
- {
- private void Application_Startup(object sender, StartupEventArgs e)
- {
- var mainWindow = new MainWindow();
- var modules = ReflectionHelper.CreateAllInstancesOf<IModule>();
- var vm = new MainWindowViewModel(modules);
- mainWindow.DataContext = vm;
- mainWindow.Closing += (s, args) => vm.SelectedModule.Deactivate();
- mainWindow.Show();
- }
- }
- class FirstDemo : ModuleBase
- {
- public override string Name
- {
- get { return "Вьюшка FirstDemo"; }
- }
- protected override UserControl CreateViewAndViewModel()
- {
- return new FirstDemoView() { DataContext = new FirstDemoViewModel() };
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement