Ich hoffe, dass jemand helfen kann.Wie binden Sie ein Ereignis an einen Befehl in einer Universal App mithilfe des MVVM-Musters?
Ich habe einige Zeit damit verbracht, den besten Weg zu untersuchen, ein Ereignis an einen ViewModel-Befehl zu binden, indem ich das MVVM-Muster verwende, wenn ich eine universelle App entwickle. Ich benutze MVVM Light. Als Test verwende ich das SelectionChanged-Ereignis einer ComboBox.
Ich habe ein paar Leute gelesen, die das Behaviors SDK aus dem Windows 8.1/WinRT-Framework geklaut haben und damit Erfolg hatten. Ich habe auch das SDK der Universal App-Verhaltensweisen in mein Projekt aufgenommen und Folgendes versucht (zusammengestellt aus Windows 8.1-Beispielen, aber unter Verwendung des UWP SDK).
XAML
<Page
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core" />
...
<ComboBox ItemsSource="{Binding InputQuantities}">
<interactivity:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="SelectionChanged">
<core:InvokeCommandAction Command="{Binding SomeComboBoxCommand}" CommandParameter="Foo" />
</core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</ComboBox>
Ansicht Modell
public RelayCommand SomeComboBoxCommand {get; set;}
jedoch der Kern: InvokeCommandAction ist nicht Teil des Behaviors SDK und i ungültig Typ erhalten: erwartete Typ ist ‚Microsoft.Xaml .Interactivity.ActionCollection '. Ich habe versucht, eine ActionCollection zu verwenden .... aber ich bin mir nicht sicher, ob ich weiß, was ich damit mache.
Ive erhielt es erfolgreich mit kompilierten Bindungen zu arbeiten und Laurent mit Blog Post:
XAML
<ComboBox ItemsSource="{Binding InputQuantities}" SelectionChanged="{x:Bind Vm.SomeComboBoxCommand }" />
Ansicht Modell
public void SomeComboBoxCommand(object sender, SelectionChangedEventArgs e){//do stuff}
Ich weiß, das ist nicht, was Laurent ist Absicht, hier zu demonstrieren und ich denke, dies zu tun, ich s bricht die Entkopplung von View und VM, indem ich dann auf eine UI-Komponente in meinem View-Modell referenzieren muss, um das ausgewählte Item zu erhalten. Aber ich habe Hinweise darauf gefunden, dies während meiner Forschung zu tun.
Also wie kann ich das mit den Universal App Interaktionsverhalten funktionieren, wenn das der richtige Weg ist, es natürlich zu tun?
Update 1. Dies ist, was ich versucht, hinzuzufügen, glauben, falsch, dass ich das universelle App-Verhalten SDK hinzugefügt wurde. Ich habe zu der Zeit nicht bemerkt, dass Windows 8.1 betroffen ist.
Aber meine Fragen stehen immer noch: Warum wird die InvokeActioncommand
funktionieren und warum wirft es den erwähnten Fehler? Ich werde mir die anderen Beiträge ansehen, sobald ich an die Arbeit komme.
Update 2 Nach der Prüfung dieser auf meine Arbeiten PC (exakt gleichen Code wie oben, 1. Beispiel und die gleichen Verhaltensweisen SDK) es funktioniert gut und ich bekomme das Verhalten, das ich erwarten würde. Ich muss erneut auf meinem Heim-PC testen, um zu sehen, was falsch gelaufen ist. (Dank an Justin XL mit mir kleben)
Update 3 Für Vollständigkeit, nach der Rückkehr nach Hause bekam ich die neueste Version meines Projektes (davor auf meinen Arbeiten PC eingecheckt) und es funktioniert nun auch auf meinem Heim-PC.Ich bin mir nicht sicher, in welchem Zustand sich mein Visual Studio befand, aber es hat mich ausreichend genug verwirrt, um diese Frage zu stellen. Zumindest sollte dies als ein Dokument darüber dienen, was zu tun ist, was im Titel beschrieben wird. Danke für deine Hilfe.
Interessant, können Sie mir bitte sagen, den Pfad zu Ihrem UWP sdk? Ist es 'C: \ Programme (x86) \ Microsoft SDKs \ UAP \ v0.8.0.0 \ ExtensionSDKs'? Verwenden Sie Visual Studio 2015 RTM? –
Oh. Nein ist es nicht. Sein 'C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v8.1 \ ExtensionSDKs \ BehaviorsXamlSDKManaged \ 12.0 \' - Ich werde meine Frage aktualisieren, um dies zu reflektieren. –
Oh ok, dann ist dies die SDK von Windows 8.1, die Sie verwenden sollten. Ich glaube nicht, dass es noch eine für UWP gibt. –