[英]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.