2015-08-31 4 views
10

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. Behaviours SDK

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.

+1

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? –

+0

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. –

+1

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. –

Antwort

2

Wir scheinen immer diese Frage viel in letzter Zeit wird in verschiedenen Varianten ...

ich mit Universal-App nicht vertraut bin aber gibt es einen bestimmten Grund, warum Sie ein Ereignis zu verwenden sind versuchen? WPF/Silverlight usw. sind datengesteuert, Sie müssen lediglich das SelectedItem-Element der ComboBox an eine Eigenschaft in Ihrem Ansichtsmodell binden, und der Setter wird immer dann aufgerufen, wenn der Benutzer ein neues Element auswählt. Häufig müssen Sie genau die gleiche Verarbeitung als Reaktion darauf, dass andere Teile Ihres Ansichtsmodells sie ändern (z. B. in Master-Child-Ansichten), so dass diese Logik an einer einzigen Stelle im Allgemeinen für eine viel sauberere Architektur sorgt.

+0

Es gibt Dinge, die Sie nicht mit Eigenschaften tun können oder nicht tun würden. Zum Beispiel, ein Knopf klicken, ja, Sie können einen 'Befehl' dafür verwenden, aber was ist mit' DoubleTap' oder 'Hold'? Sie benötigen eine Möglichkeit, Ereignisse an einen 'Comand' anzuhängen,' InvokeCommandAction' ist einer von ihnen. Es ist auch sehr MVVM. –

+0

@Justin: True, aber selbst in diesen Fällen binden Sie immer noch an eine Eigenschaft ... Sie binden normalerweise nur eine angefügte Eigenschaft, die einen Event-Handler explizit aufruft, und Sie verlieren dabei bestimmte Funktionen. Es ist eine zusätzliche Schicht, die über dem zugrundeliegenden Datenbindungsmechanismus sitzt und in den meisten Fällen nicht benötigt wird. –

+0

Ja, 'Command' ist eine Eigenschaft, ich sollte genauer sein. Aber was ich sagen wollte, ist, dass man in vielen Fällen die Ereignisbindung einfach nicht ignorieren kann, daher wurde die Frage gestellt. –

0

prüfen Sie diesen Link: MVVM EventBinding Library, erklärt über MVVM EventBinding. Dies entkoppelt die View & View Modell & nur die Argumente an den Befehl übergeben.

+0

Hallo Nikita, dieser Link bezieht sich auf WPF und Silverlight. Ich bin auf der Suche nach dem richtigen Weg, um ähnliches Verhalten in der UWP zu implementieren. Vorzugsweise, ohne sich auf eine 3rd-Party-Lib wie in Ihrem Link, sondern stattdessen auf das Behaviors-SDK von Microsoft zu verlassen, zu dem ich lerne, ist es in UWP noch nicht verfügbar. –

+1

haben Sie diesen Link überprüft (nicht sicher, aber vielleicht helfen): http://reflectionit.nl/Blog/2013/windows-8-xaml-tips-creating-blend-behaviors –

+0

ich viele, viele Blog-Beiträge überprüft die bekommen Arbeitsbeispiel oben. Aber danke dafür, es ist sicherlich sinnvoll im Zusammenhang mit dieser Frage. –

Verwandte Themen