Modified SetCommand to allow avoiding explicit type parameter when using an

Android CheckBox and the default CheckedChange event.
This commit is contained in:
Laurent Bugnion 2016-04-20 23:38:18 +02:00
Родитель 0f60739e36
Коммит 48064a528d
4 изменённых файлов: 163 добавлений и 28 удалений

Просмотреть файл

@ -272,15 +272,7 @@ namespace GalaSoft.MvvmLight.Helpers
var castedBinding = (Binding<T, T>)commandParameterBinding; var castedBinding = (Binding<T, T>)commandParameterBinding;
EventHandler handler = (s, args) => var handler = e.GetCommandHandler(eventName, t, command, castedBinding);
{
var param = castedBinding == null ? default(T) : castedBinding.Value;
if (command.CanExecute(param))
{
command.Execute(param);
}
};
e.AddEventHandler( e.AddEventHandler(
element, element,
@ -378,13 +370,7 @@ namespace GalaSoft.MvvmLight.Helpers
var t = element.GetType(); var t = element.GetType();
var e = t.GetEventInfoForControl(eventName); var e = t.GetEventInfoForControl(eventName);
EventHandler handler = (s, args) => var handler = e.GetCommandHandler(eventName, t, command);
{
if (command.CanExecute(null))
{
command.Execute(null);
}
};
e.AddEventHandler( e.AddEventHandler(
element, element,
@ -460,13 +446,7 @@ namespace GalaSoft.MvvmLight.Helpers
var t = element.GetType(); var t = element.GetType();
var e = t.GetEventInfoForControl(eventName); var e = t.GetEventInfoForControl(eventName);
EventHandler handler = (s, args) => var handler = e.GetCommandHandler(eventName, t, command, commandParameter);
{
if (command.CanExecute(commandParameter))
{
command.Execute(commandParameter);
}
};
e.AddEventHandler( e.AddEventHandler(
element, element,

Просмотреть файл

@ -16,8 +16,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Reflection;
using System.Windows.Input;
using Android.Views; using Android.Views;
using Android.Widget; using Android.Widget;
using GalaSoft.MvvmLight.Command;
namespace GalaSoft.MvvmLight.Helpers namespace GalaSoft.MvvmLight.Helpers
{ {
@ -84,5 +87,100 @@ namespace GalaSoft.MvvmLight.Helpers
return eventName; return eventName;
} }
internal static Delegate GetCommandHandler(
this EventInfo info,
string eventName,
Type elementType,
ICommand command)
{
Delegate result;
if (string.IsNullOrEmpty(eventName)
&& elementType == typeof (CheckBox))
{
EventHandler<CompoundButton.CheckedChangeEventArgs> handler = (s, args) =>
{
if (command.CanExecute(null))
{
command.Execute(null);
}
};
result = handler;
}
else
{
EventHandler handler = (s, args) =>
{
if (command.CanExecute(null))
{
command.Execute(null);
}
};
result = handler;
}
return result;
}
internal static Delegate GetCommandHandler<T>(
this EventInfo info,
string eventName,
Type elementType,
RelayCommand<T> command,
Binding<T, T> castedBinding)
{
Delegate result;
if (string.IsNullOrEmpty(eventName)
&& elementType == typeof(CheckBox))
{
EventHandler<CompoundButton.CheckedChangeEventArgs> handler = (s, args) =>
{
var param = castedBinding == null ? default(T) : castedBinding.Value;
command.Execute(param);
};
result = handler;
}
else
{
EventHandler handler = (s, args) =>
{
var param = castedBinding == null ? default(T) : castedBinding.Value;
command.Execute(param);
};
result = handler;
}
return result;
}
internal static Delegate GetCommandHandler<T>(
this EventInfo info,
string eventName,
Type elementType,
RelayCommand<T> command,
T commandParameter)
{
Delegate result;
if (string.IsNullOrEmpty(eventName)
&& elementType == typeof(CheckBox))
{
EventHandler<CompoundButton.CheckedChangeEventArgs> handler = (s, args) => command.Execute(commandParameter);
result = handler;
}
else
{
EventHandler handler = (s, args) => command.Execute(commandParameter);
result = handler;
}
return result;
}
} }
} }

Просмотреть файл

@ -16,7 +16,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Reflection;
using System.Windows.Input;
using Foundation; using Foundation;
using GalaSoft.MvvmLight.Command;
using UIKit; using UIKit;
namespace GalaSoft.MvvmLight.Helpers namespace GalaSoft.MvvmLight.Helpers
@ -349,5 +352,59 @@ namespace GalaSoft.MvvmLight.Helpers
return eventName; return eventName;
} }
internal static Delegate GetCommandHandler(
this EventInfo info,
string eventName,
Type elementType,
ICommand command)
{
// At the moment, all supported controls with default events
// in iOS are using EventHandler, and not EventHandler<...>.
EventHandler handler = (s, args) =>
{
if (command.CanExecute(null))
{
command.Execute(null);
}
};
return handler;
}
internal static Delegate GetCommandHandler<T>(
this EventInfo info,
string eventName,
Type elementType,
RelayCommand<T> command,
Binding<T, T> castedBinding)
{
// At the moment, all supported controls with default events
// in iOS are using EventHandler, and not EventHandler<...>.
EventHandler handler = (s, args) =>
{
var param = castedBinding == null ? default(T) : castedBinding.Value;
command.Execute(param);
};
return handler;
}
internal static Delegate GetCommandHandler<T>(
this EventInfo info,
string eventName,
Type elementType,
RelayCommand<T> command,
T commandParameter)
{
// At the moment, all supported controls with default events
// in iOS are using EventHandler, and not EventHandler<...>.
EventHandler handler = (s, args) => command.Execute(commandParameter);
return handler;
}
} }
} }

Просмотреть файл

@ -207,7 +207,7 @@ namespace GalaSoft.MvvmLight.Test.Binding
} }
[Test] [Test]
public void SetCommand_OnCheckBoxNoValueNoEventName_ClickEventShouldBeUsed() public void SetCommand_OnCheckBoxNoValueNoEventName_CheckedChangeEventShouldBeUsed()
{ {
var value = DateTime.Now.Ticks.ToString(); var value = DateTime.Now.Ticks.ToString();
var vmTarget = new TestViewModel(); var vmTarget = new TestViewModel();
@ -215,7 +215,7 @@ namespace GalaSoft.MvvmLight.Test.Binding
var checkBox = new CheckBox(Application.Context); var checkBox = new CheckBox(Application.Context);
checkBox.SetCommand<CompoundButton.CheckedChangeEventArgs>(vmTarget.SetPropertyWithoutValueCommand); checkBox.SetCommand(vmTarget.SetPropertyWithoutValueCommand);
Assert.IsNull(vmTarget.TargetProperty); Assert.IsNull(vmTarget.TargetProperty);
checkBox.PerformClick(); checkBox.PerformClick();
@ -279,7 +279,7 @@ namespace GalaSoft.MvvmLight.Test.Binding
vmSource, vmSource,
() => vmSource.Model.MyProperty); () => vmSource.Model.MyProperty);
checkBox.SetCommand<string, CompoundButton.CheckedChangeEventArgs>( checkBox.SetCommand(
vmTarget.SetPropertyCommand, vmTarget.SetPropertyCommand,
_binding); _binding);
@ -319,7 +319,7 @@ namespace GalaSoft.MvvmLight.Test.Binding
var checkBox = new CheckBox(Application.Context); var checkBox = new CheckBox(Application.Context);
checkBox.SetCommand<string, CompoundButton.CheckedChangeEventArgs>( checkBox.SetCommand(
vmTarget.SetPropertyCommand, vmTarget.SetPropertyCommand,
value); value);
@ -379,7 +379,7 @@ namespace GalaSoft.MvvmLight.Test.Binding
var vmTarget = new TestViewModel(); var vmTarget = new TestViewModel();
var checkBox = new CheckBox(Application.Context); var checkBox = new CheckBox(Application.Context);
checkBox.SetCommand<CompoundButton.CheckedChangeEventArgs>(vmTarget.TestCommandImpl); checkBox.SetCommand(vmTarget.TestCommandImpl);
var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; var castedCommand = (CommandImpl)vmTarget.TestCommandImpl;