如何使用mvvm绑定CarouselView的翻转动作?

时间:2016-08-03 12:55:30

标签: xaml mvvm xamarin.forms

我关注了this文章并在我的Xamarin表单应用程序中实现了CarouselView,但我无法确定在翻转时绑定哪个事件或命令。我想在翻转时执行一些代码。我可以使用ItemSelected或PositionSelected后面的代码来做到这一点,但我希望在ViewModel中完成。当我尝试在这些2上绑定命令时,如下所示,它会抛出一个异常,说"没有找到名称PositionSelected的属性"

XAML:

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

视图模型:

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

1 个答案:

答案 0 :(得分:2)

我认为PositionSelected属性无法绑定和/或需要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更容易实现。使用这些行为,您可以将Events转换为Commands(以及其他内容)

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

不要忘记在页面xmlns:b="clr-namespace:Xamarin.Behaviors;assembly=Xamarin.Behaviors"

中插入名称空间

此外,CommandParameter中还有一个b:EventToCommand可用于为您调用的命令提供参数。

另请查看这些blog posts以获取更多相关信息。