2011-04-06 23 views
8

我們的應用程序是一個大項目,有許多模塊和視圖。主窗口中有一個功能區,我們正在尋找將該功能區集成到應用程序中的最佳方式。使用Microsoft(或其他)與大型項目絲帶和MVVM

我已經創建了模塊的意見可以註冊加入與它們相關絲帶項目,此外,任何主視圖實例可以提供相關的該實例自身的帶狀物品的服務。 RibbonItem是一個抽象Ribbon項目選項的小類,主要包含Title,Description,Command,UIType和ChildItems。當主視圖改變時,該服務負責重建功能區。

我的一位同事認爲這是不好的MVVM,因爲用戶需要用C#代碼而不是XAML設計他們的功能區視圖,他還說這樣做很難讓一組項目被禁用或啓用因爲這些項目的每條命令都需要分別更新其CanExecute。相反,他建議有一個主功能區查看和視圖模型文件,其中是要添加功能區按鈕爲她的模塊或視圖中的每個開發人員需要增加他們在查看XAML和視圖模型中添加相關的命令。此外,VisualStates將用於確定將根據ViewModel中的更改(如視圖更改或選擇更改)顯示或啓用哪些項目。我真的不喜歡這個解決方案,主要是因爲所有開發人員都必須將他們的模塊知識放在一個大文件中。

注意,在一些色帶項目(例如選項,出口)是共同的整個應用程序,而另一些則相關於特定的應用程序域和一些僅用於一個特定視圖相關的。

編輯:我想我的主要問題是什麼是推薦的方式,以允許多個開發團隊集成在一個功能區?我們應該有一個單一的RibbonView和單RibbonViewModel其中將包含所有可能的物品絲帶,每隊會增加它的項目,這些V/VM和也(可能通過使用可視狀態)確定何時展示他們的邏輯?或者,我們是否允許每個視圖,視圖模型或模塊註冊功能區項目(在他們自己的C#代碼中)針對某項服務,然後讓該服務根據需要呈現功能區,當活動視圖隨註冊該類型的所有項目發生更改時?或者有沒有更好的方法來實現這種整合?

您認爲如何? 對於如何管理多個開發人員共有的單一功能區資源,您是否有更好的主意或意見?

感謝, splintor

+1

那麼,ViewModels不應該「知道」任何有關功能區。他們不應該控制功能區中顯示的內容和不顯示的內容。視圖應該響應ViewModel的狀態變化,以確定什麼和不顯示。 – Will 2011-04-06 19:11:00

+0

這意味着什麼「重建絲帶」?如果您針對不同的視圖有不同的色帶,這不是一種好的做法,因爲色帶必須只有一個。你的同事是對的。而且我只允許一個開發人員更換功能區。 – vorrtex 2011-04-06 22:10:15

+0

這是一個帶有多種選項卡類型的選項卡式應用程序 - 每種類型都有自己的功能區命令。我不認爲功能區中包含所有項目,而是在更改標籤頁時更容易重新構建相關項目的功能區內容。與你所說的不同,我的同事說,每個人都在主要的功能區文件中編輯他們的部分,因爲每個開發人員都知道她希望她的絲帶項目看起來如何。我真的不喜歡有兩個大文件集中關注整個應用程序及其屏幕的知識 - 這是一個大型應用程序,我們需要儘可能分解它。 – splintor 2011-04-07 05:56:23

回答

1

我同意威爾的評論,您的視圖模型不應該關心或不知道它是怎麼被渲染,或者如果設計師決定更改它的呈現方式。

一個ViewModel 應該只包含所有需要的信息爲表示層來呈現它。

因此視圖模型應該具有的區欄需要結合才能正常運行的所有屬性。然後你可以使用Resources.xaml或其他策略來呈現它。

拍攝一個鏡頭在黑暗中我會嘗試這樣的的ViewModels:

public interface IMenuViewModel : INotifyPropertyChanged 
{ 
    ICommand Command {get;} 
    string Title {get;} 
    string Description {get;} 
    UIType Type {get;} 
    IList<IMenuViewModel> ChildItems {get;} 
} 

我會那麼很可能創建一個抽象類,它提供工具INotifyPropertyChanged與集合類的工具INotifyCollectionChanged照顧管道代碼。

那麼我可能會做這樣的事情在Resources.xaml

<DataTemplate DataType="{x:Type vm:IMenuViewModel}"> 
    <StackPanel> 
    <Button Command="{Binding Command}" Content="{Binding Type}"/> 
    <ItemsControl ItemsSource="{Binding ChildItems}"/> 
    </StackPanel> 
</DataTemplate> 

爲您的ViewModels

,然後所有的人所要做創建一個進入你的絲帶提供一個默認視圖酒吧是

1)實施IMenuViewModel

2)可選的,如果他們WA再添DataTemplate中進入你的resources.xaml nt他們的小部件呈現不同的像這樣:

<DataTemplate DataType="{x:Type vm:FooViewModel}"> 
    <v:FooView /> 
</DataTemplate> 

我希望我沒有深入瞭解我將如何實施。

重點在於ViewModel應該只顯示視圖執行作業所需的屬性(即呈現ViewModel),而不是ViewModel執行該作業或關心它如何完成。

+0

我想你錯過了我的主要觀點 - 我會添加一個更新來使我的問題更清晰。 – splintor 2011-04-06 21:25:13

相關問題