2009-06-04 3 views
18

Beim Erstellen einer WPF-Anwendung mit dem MVVM-Muster, , scheint es, ich muss die erforderlichen Tools selbst sammeln, um sogar die rudimentärste Ereignisbehandlung zu beginnen, z.Warum werden Ereignisse und Befehle in MVVM von WPF/Visual Studio nicht unterstützt?

  • AttachedBehaviors ich von here
  • DelegateCommands ich von here bekommen

Jetzt für irgendeine Weise behandeln die itemSelected Ereignis in einem ComboBox und bin immer Anregungen von Tricks, die ich bin auf der Suche und Problemumgehungen, um dies zu tun (mit einem XAML-Trigger oder andere Elemente an das ausgewählte Element gebunden, usw.). Ok, ich kann diesen Weg gehen, aber es scheint das Rad neu zu erfinden. Es wäre nett, nur einen ItemSelected-Befehl zu haben, den ich in meinem ViewModel behandeln kann.

Fehle ich einige Reihe von Standard-Tools oder ist jeder MVVM mit WPF grundsätzlich den Aufbau und die Zusammenstellung ihrer eigenen Sammlung von Werkzeugen zu tun, nur damit sie die einfachsten Sanitär-Aufgaben mit Ereignissen und Befehle zu tun, Dinge, die nur nehmen Paar Zeilen in Code-Behind mit einem Click = "eventHandler"?

+7

Ich muss zustimmen, dass WPF wirklich eine Reihe von Funktionen für MVVM vermisst ... Es wäre schön, wenn Microsoft könnte eine Art von "offiziellen" MVVM-Toolkit bieten! –

Antwort

7

Laut Josh Smith article über MVVM, wurde im Oktober 2005 auf John Gossman's blog der Welt enthüllt.

Von da an würde ich sagen, dass es noch 2-3 Jahre dauerte, bis WPF/MVVM wirklich abheben und von der Community akzeptiert wurde, bis es dann zu spät war, WPF zu unterstützen, um die Probleme mit MVVM zu unterstützen. Auch würde ich sagen, dass WPF MVVM erstellt hat, so dass es rückwärts scheint, WPF zu haben, um MVVM zu unterstützen.

schließlich nicht jeder WPF tun verwendet MVVM, so dass die API benötigt die Standardverwendung von Veranstaltungen zu unterstützen usw.

, also Ihre Frage zu beantworten, ist ja jeder zur Zeit ihre eigene Reihe von Tools Zusammenstellung als " Offizielle "Unterstützung" stellt zu diesem Zeitpunkt nur das DelegateCommands-Framework zur Verfügung.

+2

lol, ich liebe diese Idee der "enthüllen" ein "Muster", als ob es ein Produkt – Schneider

+2

Es ist schade, dass Microsoft nicht etwas für explizite MVVM wie sie es mit ASP.NET MVC freigegeben hat. – Kelly

0

Werfen Sie einen Blick auf diese MVVM-Projektvorlage für VisualStudio.

http://blogs.msdn.com/llobo/archive/2009/05/01/download-m-v-vm-project-template-toolkit.aspx

Mit dieser Vorlage können Sie verschiedene DelegateCommand Klassen erhalten, die unterschiedlichen Bedürfnisse für ICommands decken und eine CommandReference Klasse, die mit Tastenbelegungen hilft.

Es ist ein guter Anfang ...

+0

Ja, das ist, was ich oben zu DelegateCommands verlinkt habe, nahm ich dieses Projekt, machte einige Änderungen und fügte AttachedBehaviors hinzu und kam mit dieser MVVM-Vorlage http://tanguay.info/web/index.php?pg=codeExamples&id=195 auf Ich benutze wenn ich MVVM mache, aber es reicht immer noch nicht wenn ich sowas so einfach machen möchte wie zB Behandeln eines ItemSelected-Ereignisses in einer Combobox. Ich werde dies weiter hinzufügen, während ich MVVM-Tools erhalte, aber es wäre nett, andere Versuche bei solchen Sammlungen zu finden, die das MVVM VS-Template erweitern. –

2

Weil MVVM wurde nach WPF "erfunden" ... daher, warum große Teile des MVVM Puzzle sind nicht Teil des WPF-Framework.

Nicht nur das, sondern MVVM selbst wurde zu einem "Muster" erklärt, bevor es überhaupt in der realen Welt bewiesen/praktiziert wurde. Welches ist das genaue Gegenteil von dem, was Muster sind - sie sind in der Regel entdeckt und dokumentiert nach viele Jahre erfolgreichen Einsatz von vielen verschiedenen Menschen.

Ein Typ, der mit einem Muster kommt, macht kein Muster.

+0

Ich könnte mehr nicht zustimmen. Es ist eine Eile, auf dem Musterbandwagen zu sein, und im Fall von MVVM als Teil von XAML bin ich nicht überzeugt. Ich müsste einen ernstzunehmenden Produktionscode sehen. –

+2

Es sei denn, es ist Jon Skeet, und Muster in Frage ist, dass der Hintern tritt. – Alan

16

Sie haben Recht mit der Komplexität von Befehlen.Ich versuche, dem M-V-VM-Muster so nahe wie möglich zu folgen, aber ich kann keine ausgereiften Problemumgehungen rechtfertigen, nur um ein einfaches Benutzerereignis zu behandeln.

Meiner Meinung nach ist es in Ordnung, ein Benutzerereignis in der Ansicht zu behandeln, wenn das Ihren Code stark vereinfacht. Wenn Sie ein Benutzerereignis in der Ansicht behandeln, sollte der Code-Behind Ihrer Ansicht sofort eine Methode für das ViewModel aufrufen. Auf diese Weise behalten Sie Ihre Logik im ViewModel bei ... Sie haben nur einen kleinen Installationscode (Event-Handler) in der Ansicht. Ich weiß, dass die M-V-VM-Puristen denken, dass es im Code-Behind des Views keinen Code geben sollte, aber manchmal macht es mehr Sinn, einen einfachen Standardcode wie einen Event-Handler zuzulassen. Denken Sie daran, dass andere Ihren Code in der Zukunft lesen/ändern müssen und dass es viel einfacher ist, einen Event-Handler als einen DelegateCommand zu verstehen.

+6

+1 für ein pragmatischer Programmierer. Wenn Sie die Aufrufe von Ereignisbehandlungsmethoden in Code weiterleiten, haben Sie Ihre Trennung von Bedenken, ohne dass Sie raffinierte Problemumgehungen benötigen. – dthrasher

+0

+1 Validierbarer Punkt - Ich würde diesen Approch lieber verwenden als redundanten Code zu schreiben, nur um Ereignisse in Befehle umzuwandeln. –

+0

FWIW, Codebehind ist in der Regel einfacher und einfacher, wenn Sie nur einen einzigen Befehl an einem einzigen Ort ausführen müssen. Befehle werden attraktiver, wenn Sie auch ein CanExecute benötigen (obwohl es immer noch nicht notwendig ist, hilft es, die Logik mehr zu gruppieren als die Alternative). Wo Befehle wirklich überlegen werden, ist es, wenn Sie an mehreren Stellen dieselbe Aktion ausführen (Schaltfläche/Menü/Symbolleiste/etc) oder wenn Sie zusätzliche Verhaltensweisen wie UI-Protokollierung oder Benutzerberechtigungen global dekorieren möchten. Aber wenn Ihr Anwendungsfall einfach ist, sind sie es vielleicht nicht wert. – Miral

3

Ich bin froh, dass ich nicht der einzige bin, der denkt, dass die befehlenden Implementierungen Overkill sind. Databinding scheint von Natur aus gut unterstützt zu werden, aber ich habe mir schon seit Wochen den Kopf geschlagen, weil ich versucht habe, Befehlsbindungen für andere Dinge als Knöpfe und Elemente zu verstehen, die davon erben.

Danke für das Posten dieser Frage. Ich denke, von nun an werde ich alle Ereignisse in der Ansichtsebene mit einer Umleitung auf die Ansichtsmodellfunktionen behandeln. Ich denke, so haben sie grundlegende MVVM in einem von Microsoft XAMLFest zweitägigen Kurs unterrichtet. Gut genug für mich!

Verwandte Themen