Xaml 如何使用mvvm绑定CarouseView的翻转操作?

Xaml 如何使用mvvm绑定CarouseView的翻转操作?,xaml,mvvm,xamarin.forms,Xaml,Mvvm,Xamarin.forms,我跟随文章,在我的Xamarin表单应用程序中实现了CarouselView,但我不知道在翻转时绑定哪个事件或命令。我想在翻页时执行一些代码。我可以使用ItemSelected或PositionSelected的代码隐藏来实现这一点,但我希望在ViewModel中实现这一点。当我尝试在这2个上绑定一个命令时,它抛出一个异常,说“找不到name PositionSelected的属性” XAML: 这是毫无问题的 <cv:CarouselView PositionSelected="O

我跟随文章,在我的Xamarin表单应用程序中实现了CarouselView,但我不知道在翻转时绑定哪个事件或命令。我想在翻页时执行一些代码。我可以使用ItemSelected或PositionSelected的代码隐藏来实现这一点,但我希望在ViewModel中实现这一点。当我尝试在这2个上绑定一个命令时,它抛出一个异常,说“找不到name PositionSelected的属性”

XAML:

这是毫无问题的

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

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

...
已选择位置上的专用void(对象发送方,已选择位置更改Deventargs e)
{
System.Diagnostics.Debug.WriteLine(例如SelectedPosition.ToString());
}

我认为
PositionSelected
属性不可绑定和/或使用
命令。因此,您要么必须实现一个事件处理程序,它强制转换
BindingContext
,然后从那里调用
命令。这看起来像这样:

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,所以最好实现它。有Xamarin.Forms默认行为,但我发现Corrado Cavalli的方法更容易实现。通过这些行为,您可以将
事件
转换为
命令
(以及其他内容)

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

另外,在
b:EventToCommand
中还有一个
CommandParameter
,您可以使用它为调用的命令提供参数


也可以查看这些以了解更多信息。

我不认为
PositionSelected
属性是可绑定的和/或使用
命令。因此,您要么必须实现一个事件处理程序,它强制转换
BindingContext
,然后从那里调用
命令。这看起来像这样:

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,所以最好实现它。有Xamarin.Forms默认行为,但我发现Corrado Cavalli的方法更容易实现。通过这些行为,您可以将
事件
转换为
命令
(以及其他内容)

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

另外,在
b:EventToCommand
中还有一个
CommandParameter
,您可以使用它为调用的命令提供参数


也可以查看这些以了解更多信息。

它抛出的异常是什么?@GeraldVersluis No Property of name PositionSelectedfound@GeraldVersluis请查看我更新的问题请查看我插入的答案;-)它抛出的异常是什么?@GeraldVersluis没有name-PositionSelected属性found@GeraldVersluis请查看我更新的问题请查看我插入的答案;-)谢谢你,这很有道理。请再说一件事。positionselected和ItemSelected之间到底有什么区别?当我调试它们时,下一个项目的调用都像“OnAppearing”一样?是否有任何事件会影响当前项目。因为当我想为当前项而不是下一项插入sqlite时。再次感谢:)很高兴能帮忙!如果它对您有帮助,请将其标记为答案。这两个事件是相似的。选中的
项可以被视为出现的
,因此在显示新项时发生。发生这种情况时,
PositionChanged
可能会被触发。两者的作用有些相同,但时机不同。玩一玩,看看什么时候会触发。确切地说,我调试了两个,两个都出现了。你知道有没有像Ondissapering这样的事件存在吗?不要认为有,但是当新事件出现时,你知道旧事件正在消失;)谢谢你,这很有道理。请再说一件事。positionselected和ItemSelected之间到底有什么区别?当我调试它们时,下一个项目的调用都像“OnAppearing”一样?是否有任何事件会影响当前项目。因为当我想为当前项而不是下一项插入sqlite时。再次感谢:)很高兴能帮忙!如果它对您有帮助,请将其标记为答案。这两个事件是相似的。选中的
项可以被视为出现的
,因此在显示新项时发生。发生这种情况时,
PositionChanged
可能会被触发。两者的作用有些相同,但时机不同。玩一玩,看看什么时候会触发。确切地说,我调试了两个,两个都出现了。你知道有没有像Ondissapering这样的事件存在吗?不要认为有,但是当新事件出现时,你知道旧事件正在消失;)