Привязка команды к поведению с конвертером

#c# #listview #xamarin.forms #behavior #ivalueconverter

#c# #listview #xamarin.forms #поведение #ivalueconverter

Вопрос:

Я работаю над Xamarin.Формирует проект.

У меня есть поведение в listview, которое выполняет привязку к команде с конвертером. Я сделал это с помощью XAML и C #, и это работает отлично.

Часть XAML :

 <ListView.Behaviors>
  <bh:ListViewPagingBehavior
    Command="{Binding LoadMoreLeadOfTheDateCommand}"
    Converter="{StaticResource ItemVisibilityConverter}">
  </bh:ListViewPagingBehavior>
</ListView.Behaviors>
  

Но теперь мне нужно выполнить этот процесс только для кода, потому что мне нужно было создать свой listview в коде.

Я попытался представить этот XAML следующим образом :

 ListViewPagingBehavior behavior = new ListViewPagingBehavior();
behavior.SetBinding(ListViewPagingBehavior.CommandProperty, "LoadMoreLeadOfTheDateCommand", BindingMode.Default, new ItemVisibilityEventArgsConverter());
myListView.Behaviors.Add(behavior);
  

К сожалению, IValueConverter не извлекает те же параметры, что и раньше, в методе Convert()…

Мой конвертер :

 public class ItemVisibilityEventArgsConverter : IValueConverter
{
    public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
    {
        var eventArgs = value as ItemVisibilityEventArgs;
        return eventArgs.Item;
    }

    public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
  

Хорошие параметры Convert() с рабочим кодом :

  • значение = Xamarin.Формы.ItemVisibilityEventArgs

  • TargetType = System.Объект

  • параметр = null

  • культура = null

Неверные параметры Convert() со всем моим кодом на C # :

  • значение = Делегатская команда

  • TargetType = ICommand

  • параметр = null

  • culture = {fr-FR}

Может кто-нибудь сказать мне, где я ошибаюсь? Большое спасибо!

Ответ №1:

Я не уверен, что достаточно хорошо воспроизвел ваш случай, но вот что я придумал.

 behavior.SetBinding(ListViewPagingBehavior.CommandProperty, "LoadMoreLeadOfTheDateCommand", BindingMode.Default, new ItemVisibilityEventArgsConverter());
  

Здесь вы используете свой конвертер для преобразования того, что вы привязываете, и это означает, что вы конвертируете «LoadMoreLeadOfTheDateCommand». Вот почему вы получаете DelegateCommand в качестве значения. Ваша привязка должна выглядеть следующим образом:

 behavior.SetBinding(ListViewPagingBehavior.CommandProperty, "LoadMoreLeadOfTheDateCommand");
  

А затем просто используйте свойство ConverterProperty вашего поведения (или как бы вы его ни назвали):

 behavior.Converter = new ItemVisibilityEventArgsConverter();
  

Кстати, это то, что вы делаете в своем XAML. В любом случае, это работает для меня, и я надеюсь, что это сработает и для вас 🙂

Комментарии:

1. Я не знаю почему, я не видел, что поведение имеет свойство конвертера. Теперь он работает отлично. Спасибо за ваше время, мэддью 🙂

Ответ №2:

Я понятия не имею, что ListViewPagingBehavior , поэтому я могу только догадываться, но, глядя на этот синтаксис:

 <ListView.Behaviors>
  <bh:ListViewPagingBehavior
    Command="{Binding LoadMoreLeadOfTheDateCommand}"
    Converter="{StaticResource ItemVisibilityConverter}">
  </bh:ListViewPagingBehavior>
</ListView.Behaviors>
  

Converter является свойством ListViewPagingBehavior , а не свойством {Binding} (с другой стороны, наличие конвертера видимости для конвертера может показаться очень странным).

Эквивалентный C # для этого будет выглядеть так:

 var behavior = new ListViewPageBindingBehavior();
behavior.SetBinding(ListViewPageBindingBehavior.CommandProperty, "LoadMoreLeadOfTheDateCommand");
behavior.Converter = new ItemVisibilityConverter();

myListView.Behaviors.Add (behavior);
  

Комментарии:

1. Вот и все, я не видел свойство конвертера поведения. Большое вам спасибо, теперь это работает!