2010-01-28 60 views
0

我正在使用Microsoft的Prism框架編寫應用程序,並且遇到了處理簡單的「保存文件」樣式對話框的最佳方法時遇到的問題。
注意:我不能使用標準對話框,因爲我沒有將文件保存到文件系統,所以需要從頭開始寫類似的東西。在Prism中設計一個簡單的保存對話框

因此,這裏有我有我的對話框的主要控件:

  • 用戶控制顯示文件夾的層次結構。 (IFolderView
  • 列表視圖顯示文件夾的內容。 (IFolderContentsView
  • 用戶輸入保存的文件名的文本框。

表單上唯一真正的交互是當用戶選擇左側的文件夾時,右側的列表視圖會填充文件夾內容。

當我開始編寫對話框時,我最初爲我的用戶控件創建了幾個區域,並使用視圖發現來添加我的視圖。我這樣做是因爲它在應用程序的其他地方注入了IFolderView。我現在發現我需要了解該地區的控制措施,以便他們互相交流。我想到了EventAggregator,但這並不適合簡單的保存對話框。

我對這個問題的解決方案是使用視圖注入。所以我要求我的Unity容器執行IFolderViewModel,並將其視圖設置爲初始化期間該區域的內容。這樣我就足夠了解表單上的用戶控件以使其工作,但它仍然是鬆散耦合的。

這聽起來像是一個明智的事情嗎?有沒有更好的辦法?我錯過了什麼嗎?

回答

1

大多數情況下,在使用Prism時,人們使用ISystemInteraction(類似ISystemCommands或類似的東西)來提升對話框或以某種方式與文件系統交互。這樣它仍然是可測試的,但ViewModel不負責任何視圖特定的任何事情。下面是一個例子接口:

public interface ISystemCommands 
{ 
    //Raises a save file dialog with a prepopulated name 
    void SaveFile(string name, byte[] content); 
} 

那麼你會提供要提供從殼牌會聊到文件系統的實現。這是MVVM和可測試的(我喜歡)。

這裏有一個相關的問題,基本上給出了相同的答案: Open File Dialog MVVM

+0

謝謝您的答覆,但它是不是真的是我一直在尋找。我的問題是,當我知道他們在哪個區域時,我可以通過簡單的對話使兩個控件相互交談。儘管如此,您的回覆仍然對我有用,謝謝! – 2010-01-29 09:16:56

+1

@JMitchell:這個描述更清晰。爲了讓兩個打開的視圖(以及它們的視圖模型)彼此交談,可以使用事件聚合器。但是,如果您需要雙向溝通,那可能不合適。在這種情況下,您可以使用我提出的相同接口,但要使目標視圖的ViewModel實現它,而不是Shell的中央服務。 – 2010-01-29 13:53:45