News:
|
|
Ich gehöre dann wohl eher zu den Puristen, denn meine Views kennen kein typisiertes ViewModel, auf dem sie irgendwelche Methoden aufrufen könnten. Bei mir kennt die View Ihren DataContext als System.Object, ich müsste also erst casten, um das typisierte ViewModel zu erhalten. Aus diesem Grund handhabe ich das ebenso wie @judgy in seiner Antwort vorschlägt.
– ffordermaier 20.06.2013
|
||
Verzeih kleffel, aber Deine Antwort ist einfach falsch. Es hat nichts mit Puristen oder nicht Puristen zu tun. Commands sind (!) ein wesentlicher Bestandteil von MVVM. In dem Du das ViewModel in der Code Behind Datei der View aufrufst, verbindest Du View und ViewModel, was dem Prinzip des Separation of Concerns (SoC) widerspricht. In dem Events über EventToCommand Behaviours auf das ViewModel abgebildet werden, hat man eine klare Trennung und Ordnung von Logik und View.
Ich gebe aber zu, dass man nicht immer um die Code Behind Datei herumkommt, weil VS View zentriert aufgebaut ist. – judgy 20.06.2013
|
||
@judgy: Kannst Du mir ein Beispiel nennen, bei dem man nicht um CodeBehind rumkommt? Ich habs bisher immer irgendwie geschafft, meine Geheimwaffe sind Attached Behaviors (von denen in der Blend Library ja auch ein gutes Dutzend rumliegen).
– ffordermaier 20.06.2013
|
||
@judgy dass das View mittels Command Binding nicht vom View-Model abhängt ist Haarspalterei. Ein Aufruf per Reflection ist im Endeffekt nicht anderes als Duck Typing und inhaltlich ist die Abhängigkeit eben da. Wenn du wirklich willst, dass das Codebehind keine Referenz auf das View-Model besitzt, dann benutzt eben das dynamic Keyword für den DataContext. XAML und Codebehind sind beides der View. Ob dies deklarativ im XAML oder prozedural im Codebehind geschieht, ändert nichts an den Abhängigkeiten
– kleffel 20.06.2013
|
||
@ffordermaier: Bei der PasswortBox funktioniert kein DataBinding. In so einem Fall wird es schwierig, ohne CodeBehind.
– Xantiva 21.06.2013
|
||
Ok. Aber da würd ich eher eine vernünftige PasswordBox implementieren oder zum Attached Behavior greifen. Der Vorteil des Behaviors ist, dass der Code wiederverwendbar ist und nicht in einer einzigen CodeBehind Datei rumliegt (und vlt. sogar in andere kopiert wird).
– ffordermaier 21.06.2013
|
||
@kleffel Ich weiss nicht, ob Du es nicht vielleicht komplizierter machst als es ist. Das ViewModel ist ein Abbild der View, welches mittels loser Kopplung (Binding) mit der View verknüpft wird. Das ist das Prinzip vom MVVM. Zum ViewModel gehören Eigenschaften und Methoden. Letzteres werden über EventToCommand Behaviours auf Commands im VM abgebildet.
Die Tatsache, dass es überhaupt eine Code Behind Datei gibt, hat mit dem antiquierten view-zentrierten Ansatz von Microsoft zu tun. Dort meint man immer noch mit diesem Quick-und Dirty Ansatz mehr Leute zu erreichen. Daher Finger weg davon. – judgy 24.06.2013
|
||
@ffordermaier
Bei Windows Store/WP Apps kommt man nicht immer um die Code Behind Datei herum. – judgy 24.06.2013
|
||
@judgy: Ok, danke für Info. Damit hab ich mich noch nicht beschäftigt. Hatte die WPF Brille auf.
– ffordermaier 24.06.2013
|
||
2 |
@judgy Falls Du eine Quelle hast, die
a) MVVM als >Pattern< beschreibt b) erklärt, dass/warum Commands wesentl. Bestandteil des Patterns sind (nicht nur eine gängige Variante seiner Implementierung) c) erklärt, warum ein Aufruf des VM aus dem CodeBehind eine SoC-Verletzung darstellt wäre ich sehr an einem Link interessiert. Einer, der nur a) erfüllt, wäre aber auch schon nicht schlecht. Ich kenne da eigentlich auch nur http://martinfowler.com/eaaDev/PresentationModel.html aus der Zeit, als MVVM noch PresentionModel hieß. Die meisten MVVM-Artikel reden immer gleich über die Implementierung. – Matthias Hlawatsch 24.06.2013
|
|
1 |
@kleffel: Noch eine Anmerkung zum Starten des Prozesses. Ich hätte überhaupt nichts dagegen, wenn dies vom ViewModel getriggert würde, durch Aufruf irgendeiner Komponente (via Interface). Nur im ViewModel selbst sollte sich mMn kein "Process.Start(...)" o.ä. finden. Sonst erschwerst Du das Unit-Testen des VM, und das ist doch gerade einer der wesentlichen Vorteile von MVVM.
– Matthias Hlawatsch 25.06.2013
|
|
@Hlawatsch: Das war einer der Haupgründe, warum ich das eigentlich gefragt habe: testen des VM. Aber hier wurden ja sehr umfangreiche Erläuterungen geschrieben, die ich jetzt für meinen Fall durchdenken werde.
– MyKey0815 25.06.2013
|
<ListBox Name="list">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<Command:EventToCommand
Command="{Binding Path=DataContext.DoSomethingCommand,ElementName=list}"
CommandParameter="{Binding EventArgs.OriginalSource.DataContext, RelativeSource={RelativeSource Self}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
|
@judgy Falls Du eine Quelle hast, die
a) MVVM als >Pattern< beschreibt
b) erklärt, dass/warum Commands wesentl. Bestandteil des Patterns sind (nicht nur eine gängige Variante seiner Implementierung)
c) erklärt, warum ein Aufruf des VM aus dem CodeBehind eine SoC-Verletzung darstellt
wäre ich sehr an einem Link interessiert. Einer, der nur a) erfüllt, wäre aber auch schon nicht schlecht. Ich kenne da eigentlich auch nur http://martinfowler.com/eaaDev/PresentationModel.html aus der Zeit, als MVVM noch PresentionModel hieß. Die meisten MVVM-Artikel reden immer gleich über die Implementierung. – Matthias Hlawatsch vor 4h
View <- ViewModel <-> Model
View <- ViewModel <-> ServiceAgent/Controler <-> Model
-
<- PageViewModel
View <- DataViewModel <-> ServiceAgent/Controler <-> Model
<- RessourceViewModel
|
Danke für den umfangreichen Beitrag (und wenn ich noch bewerten könnte, gäbe es +1 schon allein für die Zeit, die Du Dir dafür genommen hast). Inhaltlich muß ich mir den nochmal in Ruhe ansehen. Vielleicht kannst Du noch die Semantik der Pfeile in dem ersten "Diagramm" erläutern. Vor allem der vom ViewModel zur View irritiert mich. Die üblichen Semantiken "kennt", "hängt ab von", "ruft auf" passen ja alle nicht.
– Matthias Hlawatsch 25.06.2013
|
||
Ich wäre dafür, dass mal in einem neuen Thread in der Lounge aufmacht, um das Wesen von MVVM zu diskutieren. Ich finde es hat viele Vorteile, aber Design-ability und sogar (welch Ketzerei!) Test-ability ist zwar nett, aber nicht der Hauptvorteil!
– kleffel 25.06.2013
|
||
@kleffel: ja, könnte interessant sein, dies einmal von allen Seiten zu betrachten. Ich gebe zu, dass man irgendwann zu viele Bäume sieht und die Alternativen übersieht.
Ich halte jedoch diese Plattform als Diskussionsplattform ungeeignet. Die Kommentarfunktion ist wirklich nur zur Kommentierung und nicht zur Diskussion und die Antwortfunktion beantwortet die Frage eines Einzelnen und unterstützt nicht die Diskussion. Die Lounge ist mehr so ein Pseudoforum, was von den Funktionen her kein Forum ist, aber durch Andreas Fragen am Leben gehalten wird. ;-) Das Forum fehlt... – judgy 26.06.2013
|
Danke für die Beschreibung