3

我的 C# WPF MVVM 应用程序中有以下代码。

public RelayCommand PolishCommand
    {
        get
        {
            polishcommand = new RelayCommand(e =>
            {

                PolishedWeightCalculatorViewModel model = new PolishedWeightCalculatorViewModel(outcomeIndex, OutcomeSelectedItem.RoughCarats);
                PolishedWeightCalculatorView polish = new PolishedWeightCalculatorView(model);
                bool? result = polish.ShowDialog();
                if (result.HasValue)
                {

但我开始知道,从视图模型调用窗口在 MVVM 模式中是错误的。

在下面的链接中也有说明。

MV-VM 设计问题。从 ViewModel 调用 View

请通过提供替代解决方案来帮助我。

提前致谢。

4

3 回答 3

7

你是对的,通常你不应该视图模型访问视图。相反,在 WPF 中,我们将视图的DataContext属性设置为相关视图模型的实例。有很多方法可以做到这一点。最简单但最不正确的是创建一个新的 WPF 项目并将其放入以下构造函数中MainWindow.xaml.cs

DataContext = this;

在这种情况下,“视图模型”实际上是MainWindow“视图”背后的代码......但是视图和视图模型被绑定在一起,这是我们试图通过使用 MVVM 来避免的。

更好的方法是在 a 部分中设置关系DataTemplateResources我更喜欢使用App.Resourcesin App.xaml

<DataTemplate DataType="{x:Type ViewModels:YourViewModel}">
    <Views:YourView />
</DataTemplate>

现在,无论您在 UI 中“显示”视图模型的何处,相关视图都会自动显示。

<ContentControl Content="{Binding ViewModel}" />

第三种方法是在Resources部分中创建视图模型的实例,如下所示:

<Window.Resources>
    <ViewModels:YourViewModel x:Key="ViewModel" />
</Window.Resources>

然后,您可以像这样引用它:

<ContentControl Content="{Binding Source={StaticResource ViewModel}}" />
于 2013-08-13T08:43:30.577 回答
0

我之前回答了一个非常相似的问题,它详细说明了如何从视图模型中打开一个新窗口,同时保持 MVVM 模式所提倡的关注点分离。我希望这会有所帮助:在 MVVM 中打开一个新窗口

于 2013-08-13T09:00:57.530 回答
-2

你可以打破规则。您不必完全遵循 MVVM。我总是使用命令来创建新视图。您甚至可以为单击按钮创建一个事件(Amagosh,他刚才是不是这么说的!?)。我的意思是,这只是我的观点,我想这取决于你所从事的风格编程。

于 2013-08-13T08:40:05.143 回答