我正在尝试使用 MVP 模式开发应用程序。
问题是手动连接所有代码。我希望减少所需的代码。我试图复制另一个解决方案,但我无法开始工作。我正在使用 Winforms,而我用作源的解决方案正在使用 WPF。
它会根据一些约定进行连接:
视图事件按名称连接。例如:视图上的“Loaded”事件将连接到演示器上的“OnLoaded()”方法按钮命令按名称连接。例如:MoveNext”按钮被连接到“OnMoveNext()”方法。网格双击被连接到名称。例如:双击“Actions”将被连接到“OnActionsChoosen(ToDoAction)”
WPF中的工作代码是:
private static void WireListBoxesDoubleClick(IPresenter presenter)
{
var presenterType = presenter.GetType();
var methodsAndListBoxes = from method in GetActionMethods(presenterType)
where method.Name.EndsWith("Choosen")
where method.GetParameters().Length == 1
let elementName = method.Name.Substring(2, method.Name.Length - 2 /*On*/- 7 /*Choosen*/)
let matchingListBox = LogicalTreeHelper.FindLogicalNode(presenter.View, elementName) as ListBox
where matchingListBox != null
select new {method, matchingListBox};
foreach (var methodAndEvent in methodsAndListBoxes)
{
var parameterType = methodAndEvent.method.GetParameters()[0].ParameterType;
var action = Delegate.CreateDelegate(typeof(Action<>).MakeGenericType(parameterType),
presenter, methodAndEvent.method);
methodAndEvent.matchingListBox.MouseDoubleClick += (sender, args) =>
{
var item1 = ((ListBox)sender).SelectedItem;
if(item1 == null)
return;
action.DynamicInvoke(item1);
};
}
}
private static void WireEvents(IPresenter presenter)
{
var viewType = presenter.View.GetType();
var presenterType = presenter.GetType();
var methodsAndEvents =
from method in GetParameterlessActionMethods(presenterType)
let matchingEvent = viewType.GetEvent(method.Name.Substring(2))
where matchingEvent != null
where matchingEvent.EventHandlerType == typeof(RoutedEventHandler)
select new { method, matchingEvent };
foreach (var methodAndEvent in methodsAndEvents)
{
var action = (Action)Delegate.CreateDelegate(typeof(Action),
presenter, methodAndEvent.method);
var handler = (RoutedEventHandler)((sender, args) => action());
methodAndEvent.matchingEvent.AddEventHandler(presenter.View, handler);
}
}
private static IEnumerable<MethodInfo> GetActionMethods(Type type)
{
return from method in type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)
where method.Name.StartsWith("On")
select method;
}
private static IEnumerable<MethodInfo> GetParameterlessActionMethods(Type type)
{
return from method in GetActionMethods(type)
where method.GetParameters().Length == 0
select method;
}
无论如何,我尝试将其移植到 WinForm 应用程序,但没有成功。我将 更改RoutedEventHandlers
为EventHandlers
,但找不到如何处理LogicalTreeHelper
。
我有点坚持这一点。我可以手动完成,但我发现这个迷你框架非常天真,几乎疯了。
PS:来源是http://msdn.microsoft.com/en-us/magazine/ee819139.aspx
编辑
我才意识到一件事。我没有变笨,上面的代码对测试不太友好,是吗?