使用 autofac 时,是否可以将现有视图模型作为数据上下文传递给最近打开的对话框 window?

Is there a way to pass existing view model as a data context to recently opened dialog window, when using autofac?

我有一个项目,使用 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();
        }
    }

class 由 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 中,通过简单的 MessageDialogService:

创建了 UpdateWindow

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 的现有实例作为 DataContext 传递给 UpdateWindow。我不知道如何。现在我只设法在创建 UpdateWindow 时创建 MainViewModel 的新实例,但这不是我的目标,因为在这个 window 中我有我需要它们的控件已与 MainWindow 创建的 ViewModel 绑定。有什么方法可以做到这一点吗?

目前我只有这个:

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;
        }
    }

您需要确保正在解析 MainWindowViewModel。

使用

将 MainwindowViewModel 注册为单例
builder.RegisterType<MainViewModel>().AsSelf().SingleInstance();

然后将 MainWindowViewModel 类型的变量添加到要使用它的任何地方的 ctor。

解决那个 - UpdateWindow 是吗?

容器应提供与它为 mainwindow 提供的相同的 MainWindowViewmodel 实例。