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)); }
        }
    }
}

WPF MVVM应用程序的设计

1)是的。您需要为每个命令创建一个命令属性。但是由于您的中继命令,您不需要直接实现它。为了防止您的ViewModel破坏,我建议将所有命令移动到单独的commandviewmodel作为命令源。然后你的视图绑定到它。

2)打开对话框可以通过使用CommandBinding属性的路由命令在XAML中实现。所以任务仍然在视图中。. net提供了一些用于通用目的的可使用命令(MSDN - ApplicationCommands)

3)当然你可以在视图之间共享ViewModels。这就是你将你的实现结构成Model View ViewModel的原因之一,它独立于变更并具有可重用性。当多个视图同时更新同一个源时,这会变得很关键。