使用转换器对行为进行绑定命令

Binding command on behavior with a converter

我正在做一个 Xamarin.Forms 项目。

我在列表视图上有一个行为,它正在使用转换器对命令进行绑定。我用 XAML 和 C# 做到了,它运行得很好。

XAML 部分:

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

但现在我只需要在代码隐藏中执行此过程,因为我需要在代码隐藏中创建我的列表视图。

我试图这样描述这个 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() 的良好参数:

我所有 C# 代码的 Convert() 参数错误:

谁能告诉我我哪里错了? 非常感谢!

我不确定我是否足够好地重现了你的案例,但这是我想到的。

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

此处您使用转换器来转换您绑定的内容,这意味着您正在转换 "LoadMoreLeadOfTheDateCommand"。这就是您将 DelegateCommand 作为值的原因。您的绑定应如下所示:

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

然后只需使用您的行为的 ConverterProperty(或您所称的任何名称):

behavior.Converter = new ItemVisibilityEventArgsConverter();

顺便说一下,这就是您在 XAML 中所做的事情。不管怎样,这对我有用,我希望它也对你有用:)

我不知道是什么 ListViewPagingBehavior 所以我只能猜测,但看看这个语法:

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

ConverterListViewPagingBehavior 的 属性 而不是 {Binding} 的 属性 (有一个可见性转换器到转换器看起来很另一方面,很奇怪)。

等效的 C# 如下所示:

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

myListView.Behaviors.Add (behavior);