Xamarin 为 zxing 库形成 eventToCommand 行为

问题描述

我正在尝试使用该事件来命令 zxing 条码扫描的行为。

var eventParameters = eventinfo.EventHandlerType
                .GetRuntimeMethods().First(m => m.Name == "Invoke")
                .GetParameters()
                .Select(p => Expression.Parameter(p.ParameterType))
                .ToArray();

            var actionInvoke = action.GetType()
                .GetRuntimeMethods().First(m => m.Name == "Invoke");

                _handler = Expression.Lambda(
                eventinfo.EventHandlerType,Expression.Call(Expression.Constant(action),actionInvoke,eventParameters[0],eventParameters[1]),eventParameters).Compile();

            eventinfo.AddEventHandler(item,_handler);

代码适用于具有(对象发送者和事件参数)但 zxing 事件只有一个参数的任何其他事件。你知道我怎样才能让这段代码工作吗?

解决方法

EventToCommandBehavior 可能会将参数作为对象类型传递。

将此添加到您的 eventToCommandBehavior

public static BindableProperty EventArgsConverterProperty = BindableProperty.CreateAttached("EventArgsConverter",typeof(IValueConverter),typeof(EventToCommandBehavior),null,BindingMode.OneWay);

...

public IValueConverter EventArgsConverter
{
   get { return (IValueConverter)GetValue(EventArgsConverterProperty); }
   set { SetValue(EventArgsConverterProperty,value); }
}

...

这是 YourEventArgsConverter 的实现。

public class YourEventArgsConverter : IValueConverter
{
   public object Converter(object value,Type,targetType,object parameter,CultureInfo culture)
   {

      var eventArgs = value as [PUT YOUR EVENT ARGS TYPE HERE];
      if (eventArgs == null) 
         throw new ArgumentException("Expected YOUR EVENT ARGS TYPE as value",value)

      return eventArgs;
   }

   public object ConvertBack(object value,CultureInfo culture)
   {
      throw new NoImplementedException();
   }
}

您可以像这样使用 EventArgsConvert。

...
<ResourceDictionary>
   <converters:YourEventArgsConverter x:Key="YourEventArgsConverter" />
</ResourceDictionary>
...

<behaviors:EventToCommandBehavior
   EventName="YOUREVENTNAME"
   EventArgsConverter="{StaticResource YourEventArgsConverter}"
   Command="{Binding EventCommand}" />
...