簡體   English   中英

WPF MVVM應用程序的設計

[英]Designs of a WPF MVVM Application

我一直在使用帶有WPF的MVVM(模型視圖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 :我擔心這是“錯誤”的實現。 每個按鈕具有ICommand類型的屬性,然后具有實現該功能的相應方法,是否正確(針對MVVM)? 一個帶有很多按鈕的主窗口會有一個非常大的ViewModel類,不是嗎?

問題2 :如果按鈕之一是“文件”->“打開文件”按鈕。 因此,在這種情況下,它將打開一個新的OpenFileDialog窗口。 是否可以按照我之前做的相同方式(例如,有一個public ICommand open_file_dialog_button_pressed屬性和一個相應的public void doOpenFileDialog()方法? public void doOpenFileDialog()似乎是我將打開文件對話框的“視圖”混入了ViewModel中,盡管該視圖已經由內置的wpf OpenFileDialog類定義。

問題3:這是真的,我們的每一個應用程序的“視圖”應該只有一個單一的 “演講者”類(這是視圖模型的一部分)是該視圖結合? 在上面的示例中,我的主窗口視圖綁定到MainWindowPresenter類。 如果要進行其他視圖(例如使用在其自己的彈出窗口中使用Microsoft動態數據顯示庫生成的圖形),則在ViewModel中需要一個附加的“ presenter”類,對嗎?

非常感謝你! 豐富

作為參考,我包括了這些類,但是它們可能沒有用:

DelegateCommand類別

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

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崩潰,我建議將所有命令移到單獨的CommandsViewModel中作為命令源。 然后,您的視圖將綁定到它。

2)可以使用CommandBinding屬性通過路由命令在XAML中實現打開對話框。 因此,任務仍保留在視圖中。 您基本上試圖避免依賴於任何與視圖相關的對象。 .NET提供了一些現成的常用命令( MSDN-ApplicationCommands

3)您當然可以在視圖之間共享ViewModels。 這是您將實現結構化為Model View ViewModel的原因之一,以使其與更改無關並具有可重用性。 當多個視圖同時更新同一源時,它可能變得至關重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM