在View.cs中打开另一个窗口

时间:2016-02-18 07:45:52

标签: c# wpf mvvm

我有一个窗口,其中包含一个按钮AddParameter。 此Button有一个名为Button_Click的事件。

保持MVVM模式,允许用简单的Button_Click打开一个新窗口吗?据我所知,View的代码隐藏仍然算作View:

private void Button_Click(object sender, RoutedEventArgs e) {
    AddParameterWindow addParamWindow = new AddParameterWindow();
    addParamWindow.Show();
}

使用ICommands执行此操作似乎没必要,所以我想知道这是否仍然算作一个干净的MVVM解决方案。

2 个答案:

答案 0 :(得分:1)

我认为从MVVM中的另一个窗口打开一个窗口没有任何问题。 MVVM模式是关于以任何方式表示的ViewModel(和底层模型)表示关注点的分离,而不了解View的任何内容(参见here了解一个好的介绍)。

但是,我认为你必须问自己,制作一个新窗口是否真的是一个很好的功能。你见过应用程序产生另一个窗口,你喜欢这种行为吗?你是否给弹出窗口一个看起来像Windows的思想,并且可以绑定到与逻辑上的Window或UserControl相同的ViewModel?我个人避免实例化新的Windows,因为我可以集中我希望在每个视图中出现的内容,如样式,超时定时器等。

答案 1 :(得分:-1)

您可以使用事件Button_Click打开一个新窗口,但现在已经不在MVVM中了。 这可能不是MVVM的正确或良好的做法,但这就是我的方式:

假设你有一个像这样的ViewModelBase.cs:

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

我有一个扩展ICommand的DelegateCommand.cs:

public class DelegateCommand : ICommand
{
    private readonly Action _action;

    public DelegateCommand(Action action)
    {
        _action = action;
    }

    public void Execute(object parameter)
    {
        _action();
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

#pragma warning disable 67
    public event EventHandler CanExecuteChanged { add { } remove { } }
#pragma warning restore 67
}

现在在SampleViewModel.cs中:

public class SampleViewModel : ViewModelBase
{
    public SampleViewModel()
    {

    }

    public ICommand OpenWindowCommand
    {
        get { return new DelegateCommand(OpenSampleWindow); }
    }

    private void OpenSampleWindow()
    {
        var sampleWindow = new SampleWindow();
        sampleWindow.Show();
    }
}

现在,在您的视图中,您现在可以将命令绑定到按钮:

<Button Command="{Binding OpenWindowCommand}"/>