2011-04-06 2 views
8

私たちのアプリケーションは、多くのモジュールとビューを持つ大きなプロジェクトです。メインウィンドウにはリボンがあり、リボンをアプリケーションに統合する最良の方法を探しています。大きなプロジェクトとMVVMでMicrosoft(または他の)リボンを使用する

ビューに関連するリボンアイテムを追加するためにビューに登録できるモジュールを作成しました。また、メインビューインスタンスはそのインスタンスに関連する独自のリボンアイテムを提供できます。 RibbonItemは、リボンアイテムのオプションを抽象化し、主にタイトル、説明、コマンド、UIType、およびChildItemを持つ小さなクラスです。メインビューが変更されたときにリボンを再構築するサービスが担当します。

私の同僚は、これが悪いMVVMだと思っています。ユーザはリボンビューをXcodeでなくC#コードで設計する必要があります。また、このようにアイテムのグループを無効または有効にすることは難しいでしょうこれらのアイテムの各コマンドはCanExecuteを別々に更新する必要があるため、すぐに使用できます。代わりに、主なリボンビューとViewModelファイルを用意することを提案しました。モジュールやビューのリボンボタンを追加する各開発者は、ViewModelでそれらを追加し、ViewModelに関連するコマンドを追加する必要があります。さらに、VisualStatesは、ViewModelの変更(ビューの変更や選択の変更など)に基づいて表示または有効にするアイテムを決定するために使用されます。私は本当にこのソリューションが気に入らないのは、主にすべての開発者がモジュール知識を一度大きなファイルに入れなければならないからです。

リボン内の一部の項目(オプション、終了など)は、アプリケーション全体に共通しているものもあれば、特定のアプリケーションドメインに関連するものもあれば、特定のビューにのみ関連するものもあります。

編集:私の主な質問は、複数の開発チームが1つのリボンに統合できるようにするにはどうすればよいのでしょうか? 1つのRibbonViewと1つのRibbonViewModelを持っていて、リボン内のすべてのアイテムが含まれている必要があります。各チームはこれらのV/VMにアイテムを追加し、 ?または、すべてのビュー、ビューモデル、またはモジュール登録リボンアイテム(独自のC#コード内)をサービスと照合し、そのタイプに登録されているすべてのアイテムでアクティブビューが変更されたときに、あるいは、この統合を達成するためのより良い方法はありますか?

あなたはどう思いますか? 複数の開発者に共通の単一のリボンリソースを管理する方法について、より良いアイデアや意見がありますか?私はウィルのコメントに同意

おかげで、 splintor

+1

まあ、ViewModelsはリボンについて何も知ってはいけません。リボンに表示されているものと表示されていないものを制御してはいけません。 Viewは、ViewModelの状態変化に応答して、何を表示するかを決定します。 – Will

+0

「リボンをリビルドする」とはどういう意味ですか?異なるビューのリボンが異なる場合は、リボンが1つのみである必要があるため、これは適切な方法ではありません。あなたの同僚は正しいです。そして、私は1人の開発者だけがリボンを交換することを許可します。 – vorrtex

+0

これはタブ付きのアプリケーションで、多くのタブタイプがあります。各タイプには独自のリボンコマンドがあります。リボン内のすべてのアイテムを持つ代わりに、タブの変更が簡単になると、リボンのコンテンツを関連するアイテムで再構築することを考えました。あなたの言うこととは違って、私の同僚は、すべての開発者がリボンアイテムの見た目を知っているので、誰もがメインのリボンファイルで自分の部分を編集すると言います。アプリケーション全体とそのスクリーンに関する知識を中心にする2つの大きなファイルがあるという考えは本当に好きではありません。それは大きなアプリケーションであり、可能な限り分解する必要があります。 – splintor

答えて

1

は、あなたのviewmodelは気にしたり、それがレンダリングされている方法を知っているか、デザイナーが今までそれがレンダリングされています方法を変更することを決定した場合ではないはずです。

ViewModel には、レンダリングするプレゼンテーションレイヤーに必要なすべての情報()のみを含める必要があります。

したがって、ViewModelには、リボンバーが機能するために必要なすべてのプロパティが含まれている必要があります。それから、Resources.xamlやその他の戦略を使って提示することができます。

私はのviewmodelsのためにこのような何かをしようと暗闇の中でショットを撮影:私は、おそらくの世話をするために実装にコレクションクラスでINotifyPropertyChangedINotifyCollectionChangedを実装を提供する抽象クラスを作成します

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

配管コード。

私はその後、おそらくあなたのviewmodelsため

をデフォルトのビューを提供するために、Resources.xaml

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

にこのような何かをするだろうし、すべての誰かがあなたのリボンへのエントリを作成するために行う必要がありますバーは

1である)、彼らはワシントンあれば必要に応じて、あなたのresources.xamlに別のDataTemplateエントリを追加)IMenuViewModel

2を実装しますそれらのウィジェットは異なるようにレンダリングされていません。

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

私は実装方法について深く掘り下げなかったことを願っています。

主なポイントはViewModelだけで仕事をするか、どのように行うのを気にしないViewModelため、(ViewModelレンダリングしている)、それは仕事だ行うためにビューのために必要なプロパティを公開するべきであるということです。

+0

私はあなたが私の主なポイントを逃したと思う - 私は私の質問を明確にするためにアップデートを追加します。 – splintor

関連する問題