Есть ли способ передать существующую модель представления в качестве контекста данных в недавно открытое диалоговое окно, при использовании автозапуска? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть проект, использующий Autofac .Создается файл BootStrapper, который вызывается при запуске приложения:

public class BootStrapper
    {
        public IContainer BootStrap()
        {
            var builder = new ContainerBuilder();

            builder.RegisterType<FileDataServices>()
              .As<IFileDataServices>().SingleInstance();

            builder.RegisterType<ScrapDataServices>()
              .As<IScrapDataServices>().SingleInstance();

            builder.RegisterType<MessageDialogService>()
              .As<IMessageDialogService>().SingleInstance();

            builder.RegisterType<MainWindow>().AsSelf();
            builder.RegisterType<MainViewModel>().AsSelf();

            return builder.Build();
        }
    }

И класс вызывается из App.xaml.cs`

public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            var bootStrapper = new BootStrapper();
            var container = bootStrapper.BootStrap();
            var mainWindow = container.Resolve<MainWindow>();
            mainWindow.Show();
        }
    }

Когда MainWindowсоздан, конструктор создает экземпляр MainViewModel, который я хочу использовать позже:

public partial class MainWindow : Window
    {
        private MainViewModel _viewModel;
        public MainWindow(MainViewModel viewModel)
        {
            InitializeComponent();
            _viewModel = viewModel;
            DataContext = _viewModel;
        }
    }

В MainViewModel создается UpdateWindow с помощью простого MessageDialogService:

var result = _messageDialogService.ShowUpdateWindow();

И MessageDialogService само по себе:

public class MessageDialogService : IMessageDialogService
    {
        public MessageDialogResult ShowUpdateWindow()
        {
            return new UpdateWindow()
            {
                WindowStartupLocation = WindowStartupLocation.CenterOwner,
                Owner = App.Current.MainWindow
            }.ShowDialog().GetValueOrDefault()
              ? MessageDialogResult.Update //if DialogResult = true;
              : MessageDialogResult.Cancel; //if DialogResult = false;
        }
    }

При создании мне нужно передать существующий экземпляр MainViewModel в UpdateWindow как DataContext.И я не знаю как.Прямо сейчас мне удалось создать только новый экземпляр MainViewModel при создании UpdateWindow, но это не моя цель, потому что в этом окне у меня есть элементы управления, которые мне нужны, чтобы они были связаны с ViewModel, созданным MainWindow.Есть ли способ или способ сделать это?

В настоящее время у меня есть только это:

public partial class UpdateWindow : Window
    {
        public UpdateWindow()
        {
            var bootStrapper = new BootStrapper();
            var container = bootStrapper.BootStrap();
            var vm = container.Resolve<MainViewModel>();
            InitializeComponent();
            DataContext = vm;
        }

        private void ButtonUpdate_Click(object sender, RoutedEventArgs e)
        {
            DialogResult = true;
        }
    }

1 Ответ

1 голос
/ 29 мая 2019

Вы должны убедиться, что вы решаете MainWindowViewModel.

Зарегистрируйте MainwindowViewModel как синглтон, используя

builder.RegisterType<MainViewModel>().AsSelf().SingleInstance();

Затем добавьте переменную типа MainWindowViewModel в ctor того места, где вы хотите ее использовать.

Разрешите - UpdateWindow это?

Контейнер должен предоставлять тот же экземпляр MainWindowViewmodel, который он дал вам для основного окна.

...