Der Punkt von dem, was ich tue, ist, dass es viele Dinge im Viewmodel geben muss, aber wenn die View geladen wurde, nicht im Konstruktor. Ich könnte Ereignishandler verkabeln und Nachrichten senden, aber das scheint mir irgendwie schlampig zu sein. Ich implementiere eine Basisansicht und ein Basisansichtsmodell, in denen diese Logik enthalten ist, so dass alle meine Ansichten es hoffnungsvoll standardmäßig erhalten.mit EventToCommand & PassEventArgsToCommand :: Wie bekomme ich Absender oder besser Metapher?
Vielleicht kann ich nicht einmal bekommen, was ich will: der Absender. Ich dachte nur, dass RoutedEventArgs.OriginalSource das sein sollte?
[Bearbeiten] In der Zwischenzeit habe ich einen EventHandler in der XAML.cs angeschlossen, und natürlich OriginalSource ist auch Null. Also muss ich wirklich wissen, ob es möglich ist, einen Verweis auf die Ansicht/den Absender im Command zu bekommen? [/ Edit]
Meine Implementierung erfordert, dass eine Hilfsklasse für meine Viewmodels, die für die Erstellung von 'windows' zuständig ist, das 'host' Steuerelement kennt, dem alle Fenster hinzugefügt werden. Ich bin offen für Vorschläge, dies außerhalb des Bereichs von EventTocommand zu erreichen. :)
(der Code für Unloaded ist das gleiche)
#region ViewLoadedCommand
private RelayCommand<RoutedEventArgs> _viewLoadedCommand = null;
/// <summary>
/// Command to handle the control's Loaded event.
/// </summary>
public RelayCommand<RoutedEventArgs> ViewLoadedCommand
{
get
{
// lazy-instantiate the RelayCommand on first usage
if (_viewLoadedCommand == null)
{
_viewLoadedCommand = new RelayCommand<RoutedEventArgs>(
e => this.OnViewLoadedCommand(e));
}
return _viewLoadedCommand;
}
}
#endregion ViewLoadedCommand
#region View EventHandlers
protected virtual void OnViewLoadedCommand(RoutedEventArgs e)
{
EventHandler handler = ViewLoaded;
if (handler != null)
{
handler(this, e);
}
}
#endregion