2016-08-03 13 views
0

私はXamarinフォームアプリケーションでthisの記事を読んで、CarouselViewを実装しましたが、反転したときにどのイベントやコマンドをバインドするのかわかりません。私はそれが反転されたときにいくつかのコードを実行したい。私はItemSelectedまたはPositionSelectedを使ってコードを使用してそれを行うことができますが、これをViewModelで行いたいと思います。mvvmを使ってCarouselViewのフリッピングアクションをバインドする方法は?

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

のViewModel::私は以下のようにこれらの2のコマンドをバインドしようとすると、それは

XAML "名前のないプロパティが見つからPositionSelected" という例外がスローされます

private Command onPositionSelected; 

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

をし、これは問題なく動作します

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

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

それは投げている例外は何ですか? –

+0

@GeraldVersluisいいえ名前のプロパティPositionSelectedが見つかりました – batmaci

+0

@GeraldVersluis更新された質問をご覧ください – batmaci

答えて

2

私はPositionSelectedプロパティがbiではないと思いますndable、および/またはCommandです。したがって、あなたはBindingContextをキャストしてそこからCommandを呼び出すイベントハンドラを実装する必要があります。

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); 
    } 
} 

をしかし、それはあなたがMVVMを使用しているようで、とてもBehaviorsを実装するためにそれが良いだろう。これは、このようになります。 Xamarin.Formsのデフォルトの動作がありますが、Corrado Cavalliのbehaviors pluginが少し実装しやすくなっています。これらのビヘイビアでEventsCommands(他のものの中でも)にすることができます。

NuGetパッケージをインストールし、XAMLをこのようなものに更新します。

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

はまた、あなたがあなたの呼び出されたコマンドにパラメータを供給することが可能なb:EventToCommandで利用可能なCommandParameterがあるあなたのページにxmlns:b="clr-namespace:Xamarin.Behaviors;assembly=Xamarin.Behaviors"

を名前空間を挿入することを忘れないでください。

さらに詳しい情報についてはblogpostsをご覧ください。

+0

ありがとう、これは理にかなっています。もう1つお願いします。 PostionSelectedとItemSelectedの違いは何ですか?私がそれらをデバッグすると、次の項目のために "OnAppearing"のように呼び出されますか?現在のアイテムの予定がありますか?なぜなら、私は現在のアイテムのためにsqliteの挿入をしたいのですが、次のものは挿入しません。再度ありがとう:) – batmaci

+0

助けてくれてうれしい!それがあなたを助けてくれたら、それを答えにしてください。どちらのイベントも似ています。 'ItemSelected'は' OnAppearing'と見ることができるので、新しい項目が現れたときに起こります。ちょうどそれが起こるとき、 'PositionChanged'はおそらく発射されます。両方ともやや同じですが、タイミングが異なります。少しでも遊んで、いつ何が起こるかを見てください。 –

+0

正確に私は両方をデバッグし、両方ともOnAppearingです。 OnDissapearingのようなイベントがあるかどうか知っていますか? – batmaci

関連する問題