我关注了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());
}
答案 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
可用于为您调用的命令提供参数。