使用 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 实例。
我有一个项目,使用 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 实例。