WPF의 MVVM 패턴의 ViewModel 부분을 WPF 어셈블리를 참조하지 않고 구현하고 싶습니다. 문제가되는 부분은 명령 라우팅입니다.이 경우 ViewModel은 명령 바인딩이 작동 할 수 있도록 ICommand
유형의 속성을 구현해야합니다..NET 클래스에 속성을 주입 후 컴파일
이제 ICommand
을 피하고 단순히 object
으로 속성을 선언 할 수 있습니다. 모든 것이 여전히 효과가 있습니다. 그러나 나를 귀찮게하는 것은 입니다. 그들은을 선언해야합니다. 그들은 보일러 플레이트 코드처럼 느껴지기를 바랍니다.
내 ViewModels는 현재 다음과 같이 :
public class HelloWorldViewModel : ViewModel
{
[BoundProperty]
public string Name { get; set; }
[CommandHandler("SayHello")]
public bool CanSayHello()
{
return Name != "" && Name != null;
}
[CommandHandler("SayHello")]
public void SayHello()
{
View.ShowMessage("Hello, {0}!", Name);
}
public object SayHello { get; private set; }
}
가 CommandHandlerAttribute
명령 핸들러의 런타임 발견 (AN Action
및 선택적 Func<bool>
를) 할 수는 BoundPropertyAttribute
정말 재산에 자신을 주입하는 측면동안 세터와 전화 INotifyPropertyChanged
. 나는 컴파일러 일리 weaver을 사용하여 이것을 수행한다.
이상적으로, 나는 마지막 줄 (SayHello 속성)도 암시 적으로 만들고 싶습니다. 그것이 WPF의 요구 사항이 아니라면 소스에 포함시킬 필요가 없습니다.
그래서, 당연히, 나는 수업에 필요한 IL을 주입하는CommandHandlerAttribute
측면을 사용하여 생각하고 본질적으로 속성이을 후 컴파일 생성. 좋은 IL 작성자 (예 : PostSharp)가 더 쉽게 만들 수는 있지만 매우 어렵습니다. 나는이 여행을 시작하기 전에 모든 접근 방식에 대해 어떻게 생각하는지 듣고 싶습니다. 그것은 소리가 나는가? 더 좋은 방법이 있습니까? 어떻게/당신이 그것을합니까?
나는 "마법"메서드 및 속성 이름을 가진 반사를 사용하여 좋아하지 않는다. 나는 과거에 종종 발견했다. 나는 메소드의 이름을 바꾼다. 예기치 않은 UI UI가 컴파일러없이 오류를 일으키지 않고 멈췄다. 그러나 당신의 기본 디자인이 마음에 드는데, 람다 식으로 와이어 업을하는 것은 어떨까요? –
나는 람다에 대한 아이디어를 많이 좋아한다. 인터페이스를 단순화하기 때문에 리플렉션 (적어도 기본적으로)을 통해 "enabled"속성/이벤트를 찾는 것을 선호 할 수 있습니다. –