#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. Вот и все, я не видел свойство конвертера поведения. Большое вам спасибо, теперь это работает!