我试图开发一个使用MVP模式的应用程序。按照惯例/反射动态布线视图,模型和Presenter
问题是手动连接所有代码。我希望能够减少所需的代码。我试图复制另一个解决方案,但我无法工作。我正在使用Winforms,并且我使用的解决方案是使用WPF。
这将连线上的一些约定的事情:
查看事件由名称接线。例如:视图上的“加载”事件将连线到演示者上的“OnLoaded()”方法 按钮命令按名称连线。例如:双击“动作”将被连接到“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:Source是http://msdn.microsoft.com/en-us/magazine/ee819139.aspx
编辑
我刚刚意识到的东西。我没有失态,上面的代码不是很友好,是吗?
+1它的一个有趣的想法;我最初以为你疯了,但它有道理。 – briantyler