我有一个窗口,其中包含一个按钮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解决方案。
答案 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}"/>