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