C# 如何获取ViewModel绑定的窗口对象
我正在将应用程序重写到MvvM中,并且在从C# 如何获取ViewModel绑定的窗口对象,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在将应用程序重写到MvvM中,并且在从viewModel调用一个函数时遇到问题。该函数将它应该更改的窗口作为参数。 我的代码如下所示: this.utils = new IntroPageUtils(this); this.Dispatcher.BeginInvoke(new Action(this.utils.InitializeWizard), null); 在哪里 此=应更改的窗口 初始化我们调用的方法以使其 在代码中隐藏是很容易的,但是如何在viewModel中实现这一点呢 此
viewModel
调用一个函数时遇到问题。该函数将它应该更改的窗口作为参数。
我的代码如下所示:
this.utils = new IntroPageUtils(this);
this.Dispatcher.BeginInvoke(new Action(this.utils.InitializeWizard), null);
在哪里
- 此=应更改的窗口
- 初始化我们调用的方法以使其
public partial class IntroPage : Page
{
/// <summary>
/// Initializes a new instance of the IntroPage class.
/// </summary>
public IntroPage()
{
InitializeComponent();
}
}
我将非常感谢您提供如何解决此问题的示例、指南或教程。视图模型设置为视图的Datacontext 例如:
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainViewModel(this);
}
}
在本例中,我们将window-In参数传递给视图模型。
因此,可以在视图模型中存储对窗口的引用
class MainViewModel : ViewModelBase
{
#region fields
private MainWindow mainWindow;
#endregion
#region properties
public MainWindow MainWindow
{
get
{
return this.mainWindow;
}
}
#endregion
public MainViewModel(MainWindow mainWindow)
{
this.mainWindow = mainWindow;
}
}
我想这取决于几个问题的答案。应用程序中是否有多个IntroPageViewModel实例?这些是否特定于其视图所在的窗口?如果是这样(我假设是这样),为什么不将IntroPage实例传递到视图模型的构造函数中,然后使用它呢 然后视图模型引用了它所表示的模型,我认为这是完全有效的 i、 e 视图模型:
class IntroPageViewModel : ObservableObject, INavigable
{
private readonly IntroPage _model;
private readonly IntroPageUtils _introPageUtils;
public IntroPageViewModel(IntroPage model)
{
_model = model;
_introPageUtils = new IntroPageUtils(Window.GetWindow(_model));
}
}
无论在何处初始化视图模型实例:
IntroPage introPage = new IntroPage();
IntroPageViewModel viewModel = new IntroPageViewModel(introPage);
谢谢这段代码正在生成,但现在我得到了
TargetInvocationException
我将进一步研究这段代码,它不是MVVM。如果您所做的只是将codebehind移到另一个类中,为什么还要为MVVM重构而烦恼呢?你应该把逻辑和用户界面问题分开。我很抱歉。我得到了一份工作,将这个项目重构成mvvm。有一个页面已经以这种方式进行了重构,所以我尝试对其余页面进行同样的重构。这是我第一次使用wpf和mvvm,所以我非常感谢您的建议。
IntroPage introPage = new IntroPage();
IntroPageViewModel viewModel = new IntroPageViewModel(introPage);