2016-08-03 4 views
0

Ich folgte this Artikel und implementiert CarouselView in meiner Xamarin Forms App, aber ich kann nicht herausfinden, welches Ereignis oder Befehl zu binden, wenn es umgedreht wird. Ich möchte etwas Code ausführen, wenn es umgedreht wird. Ich kann das tun, indem ich Code hinter ItemSelected oder PositionSelected verwende, aber ich möchte das im ViewModel machen. Und wenn ich versuche, wie unten einen Befehl auf diesen 2 zu binden, wirft es eine Ausnahme zu sagen „Nein Eigentum von Namen gefunden PositionSelected“Wie binden Sie die Spiegelungsaktion für CarouselView mit mvvm?

XAML:

  <cv:CarouselView x:Name="list" Grid.Column="0" Grid.Row="1" 
    ItemsSource="{Binding Logs}" PositionSelected="{Binding OnPositionSelected}"> 
       <cv:CarouselView.ItemTemplate> 
    ... 

Ansichtsmodell:

private Command onPositionSelected; 

public Command OnPositionSelected 
{ 
    get { 
     return onPositionSelected; 
    } 
    set {    
     onPositionSelected = value; 
    } 
} 

und dies funktioniert problemlos

<cv:CarouselView PositionSelected="OnPositionSelected"> 
        <cv:CarouselView.ItemTemplate> 
     ... 

    private void OnPositionSelected(object sender, SelectedPositionChangedEventArgs e) 
     { 
      System.Diagnostics.Debug.WriteLine(e.SelectedPosition.ToString()); 
     } 
+0

Und was ist die Ausnahme, die es wirft? –

+0

@GeraldVersluis Nein Eigenschaft des Namens PositionSelected gefunden – batmaci

+0

@GeraldVersluis siehe meine aktualisierte Frage – batmaci

Antwort

2

ich glaube nicht die PositionSelected Eigenschaft ist bi ndable und/oder nimmt eine Command. Sie müssen also entweder einen Event-Handler implementieren, der Ihre BindingContext ausgibt und die Command von dort aufrufen. Dies würde in etwa so aussehen:

private void OnPositionSelected(object sender, SelectedPositionChangedEventArgs e) 
{ 
    var param = e. SelectedPosition as string; 
    var command = ((FooViewModel)BindingContext).NavigateToSomething; 

    if (command.CanExecute(param)) 
    { 
     command.Execute(param); 
    } 
} 

Aber es scheint, Sie verwenden MVVM, so wäre es besser, Behaviors zu implementieren. Es gibt Xamarin.Forms Standardverhalten, aber ich finde die behaviors plugin von Corrado Cavalli ein bisschen einfacher zu implementieren. Mit diesen Verhalten können Sie Events in Commands (neben anderen Sachen)

Schalten Sie das NuGet-Paket und aktualisieren Sie Ihre XAML auf etwas wie diese.

<cv:CarouselView x:Name="list" Grid.Column="0" Grid.Row="1" 
    ItemsSource="{Binding Logs}"> 
    <b:Interaction.Behaviors> 
     <b:BehaviorCollection> 
      <b:EventToCommand EventName="PositionSelected" Command="{Binding OnPositionSelectedCommand}" /> 
     </b:BehaviorCollection> 
    </b:Interaction.Behaviors> 
... 
</cv:CarouselView> 

Vergessen Sie nicht, den Namespace in Ihrer Seite xmlns:b="clr-namespace:Xamarin.Behaviors;assembly=Xamarin.Behaviors"

Auch gibt es eine CommandParameter in der b:EventToCommand mit dem einfügen Sie einen Parameter zu Ihrem aufgerufen Befehl liefern kann.

Überprüfen Sie auch diese blogposts für weitere Informationen zu diesem Thema.

+0

Danke, das macht Sinn. eine weitere Sache bitte. Was genau ist der Unterschied zwischen PostionSelected und ItemSelected? Wenn ich sie debugge, werden beide wie "OnAppearing" für das nächste Element aufgerufen? Gibt es ein Ereignis, das für den aktuellen Gegenstand gilt? Denn wenn ich einen SQLite-Eintrag für den aktuellen Artikel erstellen möchte, nicht den nächsten. Nochmals vielen Dank :) – batmaci

+0

Froh, zu helfen! Wenn es Ihnen geholfen hat, markieren Sie es bitte als Antwort. Beide Ereignisse sind ähnlich. Das 'ItemSelected' kann als' OnAppearing' angesehen werden, also wenn das neue Item angezeigt wird. Der 'PositionChanged' wird wahrscheinlich ausgelöst, wenn das passiert. Beide sind in etwa gleich, das Timing ist anders. Spielen Sie ein wenig und sehen Sie, was wann feuert. –

+0

genau habe ich beide debugged und beide sind OnAppearing. Weißt du, ob ein Event wie OnDissapearing existiert? – batmaci

Verwandte Themen