Ich möchte den ViewModel-Teil von WPFs MVVM-Muster implementieren, ohne WPF-Assemblys zu referenzieren. Der problematische Teil ist das Befehlsrouting, bei dem ViewModels Eigenschaften des Typs ICommand
implementieren muss, damit Befehlsbindungen funktionieren können.Eigenschaften in .NET-Klassen nach der Kompilierung einspeisen
Nun kann ich die ICommand
vermeiden und einfach die Eigenschaften als object
deklarieren. Alles funktioniert immer noch, also das ist es. Aber was mich stört ist, Ich muss sie immer noch deklarieren, und ich will wirklich nicht, weil sie wie Kessel Platte Code fühlen.
Meine Viewmodels aussehen derzeit wie folgt aus:
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; }
}
Die CommandHandlerAttribute
ermöglicht Laufzeit Entdeckung von Befehlshandler (ein Action
und eine optionale Func<bool>
), während die BoundPropertyAttribute
wirklich ein Aspekt ist, die sich in das Eigentum spritzt Setter und Anrufe INotifyPropertyChanged
. Ich begleite dies mit einer Kompilierzeit IL Weaver.
Im Idealfall möchte ich auch die letzte Zeile (die SayHello-Eigenschaft) implizit machen. Es würde keinen Sinn haben, es in der Quelle zu haben, wenn es nicht die Anforderung von WPF wäre.
Also, natürlich, ich denke, den CommandHandlerAttribute
Aspekt der Verwendung des notwendigen IL in der Klasse und im Wesentlichen Schaffung Eigentum Post kompiliert zu injizieren. Dies ist ziemlich schwierig, obwohl ein guter IL-Weber (wie PostSharp) einen langen Weg gehen kann, um es einfacher zu machen.
Bevor ich mich auf diese Reise beginne, würde ich gerne hören, was Sie alle über meinen Ansatz denken. Ist es gesund? Gibt es einen besseren Weg? Wie würdest du das machen?
Ich mag es nicht mit „Magie“ Methoden- und Eigenschaftsnamen Reflexion. Ich habe zu oft in der Vergangenheit gefunden, ich benenne eine Methode um und dann unerwartetes Bit der Benutzeroberfläche hat aufgehört zu arbeiten, ohne dass der Compiler mir einen Fehler gibt. Wie auch immer ich mag dein grundlegendes Design, was ist mit Lambda-Ausdrücken für die Verkabelung? –
Ich mag die Idee eines Lambdas sehr. Ich möchte vielleicht immer noch die "aktivierte" Eigenschaft/das Ereignis per Reflektion entdecken (zumindest standardmäßig), da dies die Schnittstelle vereinfachen würde. –