2016-08-03 3 views
0

Я следовал за статьей this и реализовал CarouselView в своем приложении форм Xamarin, но я не могу определить, какое событие или команду нужно связать, когда он перевернут. Я хочу выполнить некоторый код, когда он перевернут. Я могу сделать это, используя код с ItemSelected или PositionSelected, но я хочу, чтобы это было сделано в ViewModel. И когда я пытаюсь связать команду на эти 2, как показано ниже, он бросает исключение, говоря "Нет Свойство Имя не PositionSelected найдено"Как связать flipping action для CarouselView с помощью mvvm?

XAML:

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

ViewModel:

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 found – 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. С помощью этих Поведений вы можете превратить 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, с которой вы можете поставить параметр к вашему вызываемому Командованию.

Также ознакомьтесь с этими blogposts для получения дополнительной информации.

+0

Спасибо, это имеет смысл. еще одна вещь пожалуйста. в чем же разница между PostionSelected и ItemSelected? Когда я их отлаживаю, они называются «OnAppearing» для следующего элемента? Есть ли какое-либо событие для текущего элемента. Потому что, когда я хочу сделать sqlite-вставку для текущего элемента, а не следующего. Еще раз спасибо :) – batmaci

+0

Рад помочь! Если это вам помогло, отметьте это как ответ. Оба события похожи. «ItemSelected» можно рассматривать как «OnAppearing», поэтому это происходит, когда отображается новый элемент. «PositionChanged», вероятно, срабатывает, когда это происходит. Оба делают несколько то же самое, время отличается. Играйте с ним немного и смотрите, что срабатывает, когда. –

+0

именно я отлаживал оба и оба - OnAppearing. Вы знаете, существует ли какое-либо событие, такое как OnDissapearing? – batmaci

Смежные вопросы