2016-11-23 122 views
2

我試圖讓我的WPF應用程序分離的窗口,因此我不喜歡的東西:查看的打開從視圖模型

  • 項目。

  • ViewModel的項目。

mainwindow我的按鈕之間的結合,其位於視圖模型DLL的OpenChildWindowCommand

OpenChildWindowCommand繼承自ICommand並在MainViewModel中執行OpenChildWindow方法的調用。

現在的問題是ViewModel不知道ChildWindow,因爲它是一個不同的DLL。

我在問什麼是最好的方法呢 - 子窗口會被打開?

也許他們之間的某種消息。

+1

看看http://stackoverflow.com/questions/3801681/good-or-bad-practice-for-dialogs-in-wpf-with-mvvm – blindmeis

回答

0

使用EventAggregator用於兩個模塊之間的通信。

1

首先,我祝賀你將你的觀點從你的視角模型中分離出來 - 將它們保持在同一個組合中,導致許多人採取他們不應該的捷徑。

與你的按鈕綁定,我建議你把命令代碼放在視圖後面的代碼中。它與視圖的交互導致子窗口被打開,所以命令代碼需要位於視圖模型中根本沒有理由。您的代碼將是這個樣子:

public ICommand OpenChildWindowCommand 
{ 
    get 
    { 
     return new DelegateCommand<object>(ExecuteOpenChildWindowCommand, CanOpenChildWindowCommandExecute); 
    } 
} 

private void ExecuteOpenChildWindowCommand(object context) 
{ 
    ...code to open the child window... 
} 

private void CanOpenChildWindowCommandExecute(object context) 
{ 
    return true; 
} 

(該DelegateCommand<T>是從微軟的PRISM庫)。你的XAML會是這個樣子:

<Button x:Name="MyButtonName" 
     Command="{Binding OpenChildWindowCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" 
     /> 

我建議您做些什麼,然後就是開始使用對話服務 - 這是抽象成一個獨立的輔助式服務的一些對話相關的代碼。進入一個對話服務的細節將會使這個回答有點長,所以這裏的一些有用的鏈接,讓你開始:

如果你把你的新對話框服務使用IoC容器,那麼你可以有一些非常好的解耦MVVM和測試友好代碼,看起來像這樣:

public class MyMainWindow 
{ 
    private IDialogService dialogService; 

    public MyMainWindow(IUnityContainer container) 
    { 
     dialogService = container.Resolve<IDialogService>(); 
    } 

    private void ExecuteOpenChildWindowCommand(object context) 
    { 
     var dlg = _dialogService.Show<IMyDialogWindow>(); 
    } 
} 

(初始化容器並在應用程序啓動時儘早將接口註冊到具體的類映射)。

0

我不確定您是否在應用程序中使用任何特定的框架,但即使您不是,也可以從Microsoft's Prism frameworkMSDN Prism documentation中獲得提示。具體來說,看先進部分用戶交互模式

基本上,你只需創建您的視圖模型,其中相互作用的結果通過一個回調委託傳遞的交互請求。

通常情況下,這些都是MessageBox的簡單替換,但我已經將此模式用於更復雜的場景,如年齡驗證,確認框(是/否),甚至是要求輸入姓名和地址的整個屏幕。

對於你的問題沒有一個真正簡單的答案,因爲它真的取決於你在做什麼......但在過去,我使用MEF加載模塊,並使用EventAggregator/Container來獲取Modal的內容視窗。

真的,最終,您的主ViewModel使用接口來啓動交互,框架的其他組件會創建彈出框,加載內容並完成交互。一直以來,視圖模型都不知道窗口或彈出窗口或任何其他視圖模型,只是其他視圖模型和有效載荷類。這意味着一切都可以進行單元測試而不會有任何問題。