2016-10-11 21 views
0

Я работаю над проектом Xamarin.Forms.Команда привязки к поведению с преобразователем

У меня есть поведение в 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.Forms.ItemVisibilityEventArgs

  • TargetType = System.Object

  • параметр = нуль

  • культура = null

Плохие параметры Convert() с моей все C# код:

  • значение = DelegateCommand

  • TargetType = ICommand

  • параметр = нуль

  • культура = {фр-FR}

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

ответ

0

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

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

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

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

А затем просто использовать ConverterProperty ваше поведение (или то, что вы назвали его):

behavior.Converter = new ItemVisibilityEventArgsConverter(); 

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

+0

Я не знаю почему, я не видел, что поведение имеет свойство преобразователя. Теперь он работает отлично. Спасибо за ваше время maddhew :) – Thunderburst

+0

Ха-ха, я плохо, я нажал на «старейшую» вкладку и странно, что ваш пост был вторым. Исправлено;) – Thunderburst

0

Я понятия не имею, что 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); 
+0

Вот и все, я не видел свойства конвертера поведения. Большое спасибо, сейчас он работает! – Thunderburst

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

  • Нет связанных вопросов^_^