Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取ViewModel绑定的窗口对象_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何获取ViewModel绑定的窗口对象

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中实现这一点呢 此

我正在将应用程序重写到MvvM中,并且在从
viewModel
调用一个函数时遇到问题。该函数将它应该更改的窗口作为参数。 我的代码如下所示:

this.utils = new IntroPageUtils(this);
this.Dispatcher.BeginInvoke(new Action(this.utils.InitializeWizard), null);
在哪里

  • 此=应更改的窗口
  • 初始化我们调用的方法以使其
在代码中隐藏是很容易的,但是如何在viewModel中实现这一点呢

此时,代码隐藏文件是干净的:

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