WPF MVVM应用程序的设计
本文关键字:应用程序 MVVM WPF | 更新日期: 2023-09-27 18:06:22
我一直在用WPF做大量的MVVM (Model View ViewModel)研究。我正在开发一个桌面应用程序。这个应用程序由一个主窗口组成。这个主窗口有一些按钮。此外,还有一个打开OpenFileDialog
框的按钮。
目前,这是我的ViewModel,主窗口绑定到:
MainWindowPresenter Class
namespace BMSVM_Simulator.ViewModel
{
class MainWindowPresenter : ObservableObject
{
private bool logLoaded; // true if a log is currently loaded, false otherwise
public MainWindowPresenter()
{
logLoaded = true;
}
public ICommand load_data_button_pressed
{
get { return new DelegateCommand(doLoadData); }
}
private void doLoadData()
{
// DO LOAD DATA COMMANDS
}
public ICommand exit_button_pressed
{
get { return new DelegateCommand(doExit); }
}
private void doExit()
{
// DO EXIT COMMANDS
}
}
}
问题1:我担心这是"错误的"实现。它是正确的(每MVVM)为每个按钮有类型ICommand
的属性,然后实现功能的相应方法?一个有很多按钮的主窗口会有一个非常大的ViewModel类,不是吗?
问题2:如果其中一个按钮是文件->打开文件按钮。因此,在这种情况下,它将打开一个新的OpenFileDialog
窗口。这是否会以我以前在上面做过的相同方式完成(即有public ICommand open_file_dialog_button_pressed
属性和相应的public void doOpenFileDialog()
方法)?这似乎是我混合的"视图"打开的文件对话框到ViewModel,虽然视图已经由内置的wpf OpenFileDialog
类定义。
问题3:我们应用程序的每个"视图"应该只有一个单个"presenter"类(它是ViewModel的一部分),该视图绑定到该类,这是真的吗?在上面的例子中,我的主窗口视图只绑定到 MainWindowPresenter类。如果我要制作另一个视图(比如用微软的动态数据显示库在它自己的弹出窗口中生成的图形),我需要在ViewModel中添加一个"presenter"类,正确吗?
非常感谢!丰富的
作为参考,我包含了这些类,但它们可能没有用:
DelegateCommand
Class
namespace BMSVM_Simulator.ViewModel
{
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;
#pragma warning restore 67
}
}
ObservableObject
Class
namespace BMSVM_Simulator.ViewModel
{
class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
//basic ViewModelBase
internal void RaisePropertyChanged(string prop)
{
if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
}
}
}
1)是的。您需要为每个命令创建一个命令属性。但是由于您的中继命令,您不需要直接实现它。为了防止您的ViewModel破坏,我建议将所有命令移动到单独的commandviewmodel作为命令源。然后你的视图绑定到它。
2)打开对话框可以通过使用CommandBinding属性的路由命令在XAML中实现。所以任务仍然在视图中。. net提供了一些用于通用目的的可使用命令(MSDN - ApplicationCommands)
3)当然你可以在视图之间共享ViewModels。这就是你将你的实现结构成Model View ViewModel的原因之一,它独立于变更并具有可重用性。当多个视图同时更新同一个源时,这会变得很关键。