Ich habe ein Problem beim Aufruf einer Methode für ein Benutzersteuerelement. Hör mir zu:
Ich habe ein UserControl someControl
in SomeView.xaml
Der SameView.xaml DataContext ist SomeViewModel.cs
Ich möchte irgendwie irgendwo someControl.DoStuff()
aufrufen können.
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!
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.
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.
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%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.
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) .