MVP 패턴을 사용하여 응용 프로그램을 개발하려고합니다.관습/반영을 통한 뷰, 모델 및 발표자의 동적 연결
문제는 모든 코드를 수동으로 배선하는 것입니다. 나는 필요한 코드를 줄이기를 바랬다. 다른 솔루션을 복사하려고했지만 작동하지 못했습니다. Winforms를 사용하고 있으며 소스로 사용하고 있던 솔루션이 WPF를 사용하고 있습니다.
그것은 몇 가지 규칙에 가지를 연결합니다 :
보기 이벤트는 이름으로 유선된다. 예 :보기의 "로드 됨"이벤트는 발표자의 "OnLoaded()"메서드에 연결됩니다. 단추 명령은 이름으로 연결됩니다. 예 : MoveNext "단추는"OnMoveNext() "메서드에 연결됩니다. 그리드 더블 클릭은 이름으로 연결됩니다 : 예 :"OnActionsChoosen (ToDoAction) "에"Actions "를 더블 클릭하십시오.
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 응용 프로그램에 포트에 시도하지만 실패했습니다 내가 EventHandlers
에 RoutedEventHandlers
을 변경,하지만 무엇을 찾을 수 없습니다. LogicalTreeHelper
에 대해 수행하십시오.
나는 이것에 막혔다. 나는 수동으로 할 수 있었지만,이 미니 프레임 워크는 너무 짜증나서 거의 미쳤다.
PS : 소스 편집 난 그냥 뭔가를 실현
http://msdn.microsoft.com/en-us/magazine/ee819139.aspx
입니다. 내가 바보가 아니에요, 위의 코드는 매우 친절한 테스트되지 않습니다, 그렇죠?
+1 재미있는 아이디어입니다. 처음에는 네가 미쳤다고 생각했는데 이해가가는 군. – briantyler