Aufrufen einer Methode eines Benutzersteuerelements in MVVM

8

Ich habe ein Problem beim Aufruf einer Methode für ein Benutzersteuerelement. Hör mir zu:

  1. Ich habe ein UserControl someControl in SomeView.xaml

  2. Der SameView.xaml DataContext ist SomeViewModel.cs

  3. Ich möchte irgendwie irgendwo someControl.DoStuff() aufrufen können.

  4. DoStuff ist nicht UI-spezifisch (ich hätte DoStuff nur aus dem Code-Behind von SomeView.Xaml.Cs aufrufen können, wenn es UI-spezifisch wäre, aber in diesem Fall nicht.)

Irgendwelche Ideen?

Danke!

    
LB. 13.09.2010, 23:56
quelle

7 Antworten

5

Sie werden die Antwort wahrscheinlich nicht mögen, aber Ihr ViewModel sollte Ihre Benutzeroberfläche nicht kennen. Wenn Sie auf Ihrem Benutzersteuerelement eine Nicht-UI-Methode haben, ist es wahrscheinlich an der falschen Stelle.

Das Einzige, woran ich denken könnte, ist, dass Sie vielleicht eine Art von Messaging implementieren möchten (wie sie es in MVVM Light ) haben. das könnte die Ausführung auslösen.

Entweder das oder überdenken Sie, wie Sie Ihren Code erstellt haben.

    
Robaticus 14.09.2010, 00:00
quelle
3

Es klingt, als ob DoStuff als Reaktion auf einige Daten oder Logik in Ihrer VM ausgeführt werden soll. In diesem Fall wäre die sauberste Methode wahrscheinlich, ein Ereignis zu verwenden, das von Ihrer VM stammt und von DoStuff gehandhabt wird. Wenn der Auslöser mehr wie eine Statusänderung ist, können Sie auch die entsprechenden VM-Daten an eine neue Abhängigkeitseigenschaft in Ihrem Benutzersteuerelement binden und DoStuff über den Change-Handler des DP aufrufen.

    
John Bowen 14.09.2010 00:36
quelle
1

Eine der SO-Antworten auf Achive dies entkoppelt das ViewModel-Wissen über View ist , indem die Action-Delegierten verwendet werden, die von Mert hier

Hat seinen Code hier eingefügt, wenn die Verbindung zufällig unterbrochen wird.

%Vor%     
Sai 08.10.2014 14:42
quelle
0

Im MVVM-Design besteht die Idee im Allgemeinen nicht darin, irgendeinen Code in Ihrem Benutzersteuerelement zu haben (die Datei "xaml.cs") (in einer idealen Welt). Die gesamte Interaktion zwischen der Benutzeroberfläche und dem ViewModel sollte über Befehle und Bindungen gehandhabt werden. Warum brauchen Sie DoStuff in Ihrem Benutzersteuerelement?

Sie könnten etwas wie

haben %Vor%     
Jeff 14.09.2010 00:04
quelle
0

Vielleicht sollte Ihr UserControl wirklich eine View sein, die dann ein ViewModel haben sollte, das die DoStuff () Methode enthalten würde. SomeViewModel wird instanziiert sein (SomeControlViewModel ist in der Miete cascined, um instanziiert zu werden) und so in der Lage sein, eine Methode darauf aufzurufen.

    
Maxxx 28.09.2010 05:01
quelle
0

Wenn Sie View-first approach haben (und Ihre VM als Ressource in XAML instanziiert wird), können Sie einige normale Ereignisse verwenden, um Ihre DoStuff-Steuermethode mit einem Ereignis auf der VM (bei Loaded-Ereignis) zu verbinden.

    
OldTimer 28.09.2010 05:23
quelle
0

Wenn die Methode DoStuff (); Ist eine UI-spezifische Logik vorhanden, dann ist die Methode am richtigen Ort. Wenn nicht, sollte es in einem anderen Objekt (z. B. SomeViewModel) sein.

SomeViewModel darf eine Methode auf SomeView aufrufen, wenn sie über eine Schnittstelle getrennt ist. Wie dies erreicht werden kann, zeigt das WPF-Anwendungs-Framework (WAF) .

    
jbe 28.09.2010 20:06
quelle

Tags und Links