Ich verwende MVVM und benutzerdefinierte ICommand-Objekte werden von der ViewModel-Ebene bereitgestellt. Ein ViewModel-Objekt zur selben Zeit kann über die DataContext-Eigenschaft an viele View-Objekte (Fenster, Seiten usw.) angehängt werden. In ICommand.CanExecute () möchte ich das Fehlen von Validierungsfehlern für einige Steuerelemente in View überprüfen (die an ViewModel-Props angehängt sind, die für einen bestimmten VM-Befehl von Bedeutung sind). Ein ViewModel kann viele Befehle bereitstellen, von denen jeder über eigene Steuerelemente zur Überprüfung der Fehlerüberprüfung verfügt. Also, Pseudo-XAML ist:
%Vor%Das zweite Problem besteht darin, dass der bestimmte Befehl vom Steuerelement aufgerufen werden kann, das selbst der Teil des DataTemplate für das Sammlungselement ist (in meinem Fall ein Teil der ListBoxItem-Datenvorlage). Mein Vorlagen-Listbox-Element hat zwei Textfelder (die an zwei Requisiten des entsprechenden ViewModels gebunden sind) und eine Schaltfläche, die den ViewModel-Befehl aufrufen. Also, im Befehl CanExecute () muss ich nach Validierungsfehlern für einige Fenstersteuerungen suchen & amp; zwei Textfelder, die zu diesem Listenelement gehören, keine anderen Elemente. Der folgende Code funktioniert einwandfrei, wenn ich die ListBoxItem.IsSelected-Eigenschaft als CommandParameter übergeben möchte:
%Vor%Aber wie kann ich ListBoxItem als CommandParameter übergeben (DependencyObject)? Und wie kann dieses ListBoxItem, das über {Binding RelativeSource} übergeben wurde, mit anderen aktuellen Fenstersteuerelementen im ersten Codebeispiel gemischt werden?
Es tut mir sehr leid, aber wie kann ich die Referenzen zu Steuerelementen in xaml hinzufügen?
%Vor%Ich bin mir nicht sicher, ob ich dein Beispiel richtig lese, aber es scheint etwas vom MVVM-Prinzip zu verletzen. (Ich entschuldige mich, wenn ich es falsch gelesen habe).
Die Idee hinter MVVM besteht darin, das Viewmodel von jeglicher Abhängigkeit von einer XAML / View-Entity zu entkoppeln. Sie brechen das, indem Sie das CommandParameter von der Benutzersteuerung abhängig machen. Was ich tun würde, ist das Erstellen von Statuseigenschaften im ViewModel und das Binden der usercontrol-Validierungen an diese Zustände. Dann können Sie in CanExecute die Werte dieser Eigenschaften testen, anstatt zu versuchen, an ein usercontrol zu binden.