在ViewModel中创建视图对象

时间:2013-08-13 08:29:54

标签: c# wpf mvvm commandbinding

我在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)
                {

但我开始知道,从MVM模式中调用viewmodel的窗口是错误的。

也在下面的链接中说明。

M-V-VM Design Question. Calling View from ViewModel

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

提前致谢。

3 个答案:

答案 0 :(得分:6)

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

DataContext = this;

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

更好的方法是在DataTemplate部分的Resources中设置关系(我更喜欢在App.Resources中使用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}}" />

答案 1 :(得分:0)

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

答案 2 :(得分:-3)

您可以违反规则。您不必完全遵循MVVM。 我总是使用命令来创建一个新视图。当你点击一个按钮时,你甚至可以创建一个事件(Amagosh,他只是说!?)。 我的意思是,这只是我的意见,我想这取决于你所采用的风格编程。