Я хотел бы реализовать часть ViewModel шаблона MVFM WPF без ссылки на сборки WPF. Проблемной частью является маршрутизация команд, которая требует, чтобы ViewModels реализовал свойства типа ICommand
, чтобы могли работать привязки команд.
Теперь я могу избежать 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
включает обнаружение во время выполнения обработчиков команд (Action
и необязательный Func<bool>
), в то время как BoundPropertyAttribute
действительно аспект , который внедряется в установщик свойств и вызывает INotifyPropertyChanged
. Я выполняю это, используя время компиляции IL weaver .
В идеале я бы хотел, чтобы последняя строка (свойство SayHello) тоже была неявной. Не было бы никакого смысла иметь его там в источнике, если бы это не было требованием WPF.
Итак, естественно, я думаю об использовании аспекта CommandHandlerAttribute
для внедрения необходимого IL в класс и, по существу, создания свойства после компиляции . Это довольно сложно, хотя хороший ткач IL (например, PostSharp ) может значительно облегчить процесс.
Прежде чем я отправлюсь в это путешествие, я хотел бы услышать, что вы все думаете о моем подходе. Это звук? Есть ли способ лучше? Как бы ты это сделал?