2016-04-13 6 views
0

私はWPF、MVVM、Ribbonの新機能です。 基本的に、私はMVVMの概念を理解し、ボタンを追加し、リボンメニューを構築することに成功することができます。 私は上記のすべてをリボンメニューとMVVMモデルを組み合わせるのに苦労しています。WPFリボンメニューを使用して、下のコンテンツを同じビューに表示するにはどうすればよいですか?

もっと具体的には、次のように実装することができますか? リボンメニューに2つの「タブ」があります.1つは顧客機能(追加、検索、...)、1つは在庫管理(株の検索、株の管理、...)。

今、ボタンをクリックするたびに(リボンメニューの「顧客を検索」ボタンをクリックする)、検索フォームを表示し、検索結果を新しいビューではなく、表示します。 これを同じビュー/ウィンドウに表示するが、リボンメニューの下に表示したい。 だから、新たな「機能」は、リボンメニューにトリガーされるたびに、私はそれが何度も何度も私の主なビュー/ウィンドウを再使用して、同じウィンドウ/ビューに表示したいです。

は、どのように私はこれを実装することができ、基本的には「更新」主ウィンドウに新しいボタンが新しいコンテンツでリボンにクリックされるたびに?

リボーンメニュー(MVVMのコンセプトなし)を作成するだけでなく、MVVMのコンセプトをデモンストレーションするだけで、リボンメニューは表示されない、あらゆる種類のチュートリアルとコードサンプルが見つかりました。私の愛のために、私は私が上で説明したものを実装する方法について私の頭を得ることができません...

+0

は、あなたの問題がどこにあるか、理解することは本当に難しいです。リボンメニューが含まれているビューの内容を変更する方法がわからないことは間違いないでしょうか? –

+0

まさに!私はそれを行う方法の例を正確に見つけることはできません。特にこれをMVVMコンセプト全体と組み合わせて使用​​することはできません。 1)リボンメニュー2).NET 4.5に基づいて、最新の.NETバージョンを使用3)MVVMモデルに従う4)リボンメニューとのユーザーのやりとりに応じてコンテンツを表示します...-) 私はそれを私の頭の中でクリックするようにしようとしていますが、その上でハンドルを得ることはできません。私は最終的に私にこのことがどのように作用するかを説明できる簡単な実例を探しています... – aquilares

答えて

1

一般的にあなたのビューにView-Placeholderのようなものがあります。これは、私はあなたは、単にのContentPresenterを使用することができると思う、あなたの問題のために(複数のコンテンツについて、のContentPresenterまたはちょうどのTextBlock)のItemsControlのような全く異なるもの

ことができます。

サンプルビュー:

<UserControl x:Class="WpfApplication1.View.SampleVIew" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <DockPanel> 
     <!--Ribbon Menu--> 
     <Menu DockPanel.Dock="Top" /> 

     <!--Your Content to Change--> 
     <ContentPresenter Content="{Binding CurrentContent}" /> 
    </DockPanel> 
</UserControl> 

(その代わりにメニューの、あなたのあなたのリボンを持っています。) は、その後、あなたのViewModelにあなたはViewModelにプロパティ

ViewModelBase _currentContent; 
public ViewModelBase CurrentContent 
{ 
    get { return _currentContent; } 
    set 
    { 
     _currentContent = value; 
     RaisePropertyChanged(nameof(CurrentContent)); 

    } 
} 

を持っていますRaisePropertyChanged方法は、ちょうどあなたがMVVMパターンを理解して言うとき、あなたが知っていると思うINotifyPropertyChangedのインターフェイスのにPropertyChangedイベントを、発生させます。

その後RibbonButtonのためのあなたの方法であなたは、単に別のViewModelににCurrentContentプロパティを変更します。

<DataTemplate DataType="{x:Type my:DifferentViewModel}"> 
     <local:MyUserControlForDifferentView /> 
    </DataTemplate> 

EDIT:

public void MyCommandMethod() 
{ 
    this.CurrentContent = new DifferentViewModel(); 
} 

のviewmodelsのようなDataTemplates経由ビューにマッピングする必要があり、私はWPFで始まったときに私が発見した

最高のチュートリアル、ジョシュの記事でしたスミス:私にとって this

+0

ありがとう、これは私にたくさんの情報を与えてくれました。私はいくつかの質問があります:1)UserControlの代わりにWindowを使うことができますか? 2)ContentPresenterとRibbonContentPresenterの間に違いがありますか(これはあなたのプロジェクトにリボンのリファレンスを追加した後もあります) 3) "main viewmodel"のviewmodelプロパティがViewModelBase型である特定の理由はありますか? – aquilares

+0

1.はい。 2.ここのContentPresenterはリボンとは関係ありません。 ContentPresenterは、配置したコンテンツのプレースホルダのようなものです。この場合はリボンメニューの下にあります。したがって、Differenceがどこであるかは実際問題ではありません; D 3. ViewmodelBaseクラスは、INotifyPropertyChangedインターフェイスを実装する単なるクラスです。これは必須です! これには既に言及したRaisePropertyChangedメソッドも含まれています。もしそれがあなたにとって短すぎるなら、私はすみません。私はMVVMの開始のために追加した記事に行くことを本当にお勧めします; D –

+0

ああ、あなたの答えはちょうどいいところです。私はMSDNサイトでViewmodelbaseクラスをチェックしましたが、実際にはInotifyPropertyChangeインターフェイス(私は自分のビューモデルでよくやったことがあります)を実装していることに気付きましたが、特定の理由があるかどうか疑問に思っていました。私は時々、ビュービューモデル関係が、ビューからビューモデルへだけではなく、双方向であるという事実を忘れています。貴君、あなたは神様です。あなたとすべてのあなたの兄弟に運勢が来るかもしれません:-) – aquilares

関連する問題