2016-04-13 4 views
0

Ich bin neu bei WPF, MVVM und Ribbon. Grundsätzlich kann ich erfolgreich ein Menüband erstellen, Schaltflächen hinzufügen, ich verstehe das MVVM-Konzept. Jetzt kämpfe ich, um alle oben genannten zu kombinieren: Ribbon-Menü mit MVVM-Modell.Wie verwende ich ein WPF Ribbon-Menü und zeige den Inhalt unten in derselben Ansicht an?

Genauer gesagt frage ich mich, wie ich folgendes implementieren könnte: sagen wir mal, Sie haben ein Menüband mit 2 "Tabs": eines für Kundenfunktionalität (hinzufügen, suchen, ...), eines für die Bestandsverwaltung (Bestand suchen, Bestand verwalten, ...).

Jetzt, jedes Mal, wenn ich auf eine Schaltfläche klicke (sagen wir die Schaltfläche "Kunden suchen" im Menüband), möchte ich ein Suchformular anzeigen und die Suchergebnisse darunter, aber nicht in einer neuen Ansicht. Ich möchte dies in der gleichen Ansicht/Fenster, aber unter dem Ribbon-Menü angezeigt haben. Jedes Mal, wenn eine neue "Funktionalität" im Ribbon-Menü ausgelöst wird, möchte ich, dass sie im selben Fenster/in derselben Ansicht angezeigt wird und meine primäre Ansicht/das Fenster immer wieder verwendet.

Wie kann ich dies implementieren, im Grunde "update" das primäre Fenster jedes Mal, wenn eine neue Schaltfläche in der Multifunktionsleiste mit einem neuen Inhalt angeklickt wird?

Ich habe dafür gegoogelt, ich fand alle Arten von Tutorials und Codebeispiele, die entweder nur das Ribbon-Menü (ohne MVVM-Konzept) oder einfach das MVVM-Konzept demonstrieren, aber ohne ein Ribbon-Menü, aber Für die Liebe von mir, ich kann nicht meinen Kopf herum, wie ich implementieren würde, was ich oben beschrieben ...

+0

Für mich ist es wirklich schwer zu verstehen, wo dein Problem liegt. Habe ich Recht, dass Sie nicht wissen, wie man den Inhalt einer Ansicht ändert, die ein Menüband enthält? –

+0

Genau!Genau dafür kann ich kein Beispiel finden, insbesondere in Kombination mit dem gesamten MVVM-Konzept. Ich würde fast ernstes Geld geben, um den Beispielcode einer funktionierenden einfachen Anwendung mit 1) Ribbon-Menü 2) basierend auf .NET 4.5 zu erhalten, mit aktuellen .NET-Versionen 3) nach dem MVVM-Modell 4), das auch zeigt, wie zu aktualisieren dieser Ansichtsinhalt hängt von der Benutzerinteraktion mit dem Menüband ab ... :-) Ich versuche, es in meinem Kopf anzuklicken, aber ich kann es nicht verstehen. Ich suche nach einem einfachen Arbeitsbeispiel, das mir endlich erklären könnte, wie das Zeug funktioniert ... – aquilares

Antwort

1

In der Regel haben Sie so etwas wie eine Ansicht-Platzhalter in Ihrer Ansicht, wenn Sie einen Inhalt ändern möchten . Dies kann ganz unterschiedliche Dinge wie Items sein (für mehr als einen Inhalt, eine Content oder einen Textblock)

Für Ihr Problem, ich glaube, Sie einfach einen Content verwenden können:

Beispielansicht:

<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> 

(Anstelle dieses Menü haben Sie Ihre Ihre Band.) Dann in Ihrem Viewmodel Sie ein Ansichtsmodell der Immobilie

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

    } 
} 

haben Die RaisePropertyChanged-Methode löst nur das PropertyChanged-Ereignis der INotifyPropertyChanged-Schnittstelle aus, von der Sie glauben, dass Sie wissen, dass Sie das mvvm-Muster verstehen.

Dann in Ihrer Methode für die RibbonButton ändern Sie einfach die CurrentContent-Eigenschaft zu einem anderen ViewModel.

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

EDIT:

Die beste Tutorial fand ich hatte, als ich begann, mit wpf, war der Artikel von Josh

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

Die Viewmodels sollte über Datatemplates wie zu Ansichten abgebildet werden Smith: this

+0

Danke, das gibt mir schon viele Infos. Ich habe einige Fragen: 1) Könnten Sie auch ein Fenster anstelle eines Benutzersteuerelements verwenden? 2) Gibt es einen Unterschied zwischen einem ContentPresenter und einem RibbonContentPresenter (Ich sah, dass dies auch existiert, sobald Sie die Ribbon-Referenz zu Ihrem Projekt hinzugefügt haben)? 3) Gibt es einen bestimmten Grund, warum Ihre Viewmodel-Eigenschaft Ihres "Hauptansichtsmodells" vom Typ ViewModelBase ist? – aquilares

+0

1. Ja. 2. Der ContentPresenter hier hat nichts mit Ihrem Ribbon zu tun. Der ContentPresenter ist so etwas wie ein Platzhalter für den Inhalt, den Sie einfügen. In diesem Fall befindet er sich unterhalb Ihres Menübands. Es spielt also keine Rolle, wo die Differenz liegt: D Und 3. Die ViewmodelBase-Klasse ist nur eine Klasse, die die INotifyPropertyChanged-Schnittstelle implementiert. Das ist ein Muss! Es enthält auch die RaisePropertyChanged-Methode, die ich bereits erwähnt habe. Es tut mir leid, wenn dir das zu kurz war. Ich empfehle Ihnen wirklich, mit dem Artikel zu gehen, den ich für den Start von MVVM hinzugefügt habe: D –

+0

Oh nein, Ihre Antwort ist genau richtig. Ich habe diese Viewmodelbase-Klasse auf der MSDN-Site überprüft. Ich habe tatsächlich bemerkt, dass sie nur die InotifyPropertyChange-Schnittstelle implementiert (was ich schon oft mit meinen eigenen Viewmodels gemacht habe), aber ich fragte mich, ob Sie einen bestimmten Grund dafür hatten. Manchmal vergesse ich, dass die View-View-Model-Beziehung bidirektional ist und nicht nur vom View zum View-Modell. Sie, sehr geehrter Herr, sind ein Gott. Möge das Glück Ihnen und all Ihren Geschwistern kommen :-) – aquilares

Verwandte Themen