2010-08-29 118 views
3

我將很快開始一個新項目,並正在尋找來自WPF,Prism和MVVM經驗的您的建議。Prism和MVVM用於新的WPF項目

該項目肯定是WPF,我將實施MVVM(我可能會使用Josh Smith的MVVM Foundation作爲起點),以便能夠從UI /邏輯等的分離中受益。我不確定儘管如果我也能從使用棱鏡來構建我的項目。

讓我簡單介紹一下這個項目。將有一個主要的「工具欄」,將顯示一些小部件。每個小部件都顯示與其功能相關的一些基本數據,並且單擊該小部件將打開一個新窗口,該窗口將顯示更詳細的數據幷包含用於查看/編輯數據的豐富UI。

現在,我想我可以使用棱鏡框架項目,但我從來沒有使用過它,不知道它是否適合我想要實現的。例如,我的「工具欄」是否會包含一個包含每個小部件可以填充的區域的shell?單擊某個窗口小部件時顯示的每個新窗口是否也將擁有自己的區域設置?如果我可以獲取工具欄上的工具欄和一個小部件的圖案,我可以將其複製到其餘的小部件上。

除了棱鏡,我有一個關於如何MVVM應該如何實現某些數據編輯窗口的問題。比方說,我有一個顯示一些數據的圖表,用戶可以直接在圖表上點擊/鼠標移動來編輯他所看到的數據。所有數據都在模型中,並且視圖模型通過綁定將該數據提供給視圖。我的問題是,將鼠標點擊/移動事件,特定於該視圖中的圖表,寫在哪裏?我們不希望在視圖的代碼中留下太多/任何東西,我們也不希望在視圖模型中擁有UI事件處理程序,所以我不確定如何處理這種類型的場景。我知道命令是這裏可能的答案,但我所看到的MVVM示例通常顯示簡單按鈕單擊的示例命令。大意是否一致?所以,如果任何人有任何關於上述或關於使用WPF和MVVM/Prism的一般提示的建議,請讓我知道。

謝謝。

+0

本文使用MEF而不是Prism,但在使用IoC的東西時有其他一些關於WPF和MVVM的有趣想法:http://www.codeproject.com/KB/WPF/SoapBoxCorePinBallDemo.aspx – 2010-08-31 01:12:48

回答

4

這裏有幾個問題,所以我會盡我所能全面覆蓋它們。

我曾經參與過一個WPF,MVVM和Prism等項目。最好的建議是在將它們粘合在一起之前瞭解每個組件的功能和功能。在這種情況下,您不必使用Prism的所有功能。

對於棱鏡可以使用...

  1. 殼牌和引導程序初始化其他組件的應用程序和加載模塊。
  2. 爲依賴注入創建和配置Unity。您可以使用其他DI容器。在這裏您可以添加每個模塊將使用的全局服務。
  3. 使用EventAggregator通過模塊和視圖通知應用程序的不同部分
  4. 命名UI上的區域以便模塊可以將視圖添加到特定位置的區域。

上述4並不都必須使用,但可以很容易地集成到MVVM/WPF應用程序中。

例如,將我的「工具欄」是 殼包含每個 小部件會填充區域?

在這裏你可以有一個你創建的區域(你可以從Region派生)來管理工具欄上的按鈕。 (我曾經用過一個關於Ribbon的區域)。一個服務可以通過一個接口暴露出來,每個模塊可以提供命令/圖像(你有什麼),當它被點擊時會創建一個ViewModel。你可以在模塊的初始化中做到這一點。

將各自的新窗口,是 顯示當一個widget被點擊 也有自己的殼與自己 區域設置?

如果每個按鈕打開一個全新的窗口,我會建議引入一個共同的控制器類,將創建一個通用應用窗口,並附上你的模塊創建一個視圖模型。在這種情況下不需要使用區域,除非您將不同的視圖粘貼到保持比視圖本身的壽命更長的應用程序窗口。在基本形式的窗口,可以簡單地將這個......

<Window ...> 
    <ContentControl Content="{Binding}" /> 
</Window> 

如果你的控制器內就可以做到這一點...

public void DisplayView(ViewModel vm) 
{ 
    var window = new MyWindow { DataContext = vm }; 
    window.Show(); 
} 

控制器可以在模塊中直接使用的包裹內的服務...雖然對於testabilty服務和界面將是最好的。確保您已將模塊資源與Applicaiton.Resources合併,並使用DataTemplate將您的視圖鏈接到視圖模型。

我的問題是在哪裏將鼠標 點擊/移動事件,提出了具體 到該視圖中的圖表,寫?

不要害怕背後的代碼,但在這種情況下,您可以使用EventToCommand附加的行爲將路由到您的視圖模型上的命令。 MVVMLight工具包有這個你可以重用,如果你想。

DI非常強大,我鼓勵即使沒有棱鏡也可以使用它,因爲構建視圖模型會更容易。

HTH

+0

感謝您的信息和提示。他們非常感激。 – Flack 2010-08-30 18:40:34

1

我認爲棱鏡會爲您工作。

- >我的「工具欄」是一個包含每個小部件可以填充的區域的shell嗎?

  1. 將單個區域與一個ItemsControl在殼
  2. 創建模塊每個插件
  3. 不斷增加的插件模塊以相同的ItemsControl殼區。

這樣做的最大優點是,如果添加更多模塊,則不需要更改任何內容。

- >單擊某個窗口小部件時顯示的每個新窗口是否也是它自己的具有其自己的區域設置的shell?不,你可以在shell中使用'WindowRegionAdapter'來在不同的窗口中爲你的小部件創建視圖。

- >鼠標在哪裏點擊/移動特定於該視圖中圖表的事件?

您可以使用附加行爲將視圖中的事件綁定到純粹在XAML中的ViewModel中的命令。谷歌的「混合行爲」或「附加行爲」爲你如何去做。沒有必要爲此編寫任何代碼。

說實話,我只是試圖給你你想要搜索的關鍵字,以獲得你需要的所有信息。

+0

謝謝。我會搜索一些更多的信息。 – Flack 2010-08-30 18:40:58