Yesterday, while chatting with the highly talented Jeremiah Morrill and other WPF Disciples about some MVVM subtleties (for the full post see here), Jeremiah briefly touched on the topic of providing ViewModels with the awareness of being active or inactive within a Prism based application. I wanted to explore this further, and decided to integrate this functionality into Calcium. What I provide here isn't rocket science, and merely serves to illustrate one of indeed many design approaches that could be applied to accomplish the same thing.
For this I had two goals. The first, to provide the capability without coupling the ViewModel to the View. That is, without requiring the ViewModel to have a reference to the View. The second, to not depend on a base class for the functionality; forever tying the developer to my base class implementation (
ViewModelBase). So, indeed, I chose an interface based approach. To be Prism-esque I have adapted Jeremiah's approach which was to implement Prism's
IActiveAware interface on my base view class. I then feed an intermediary object to the ViewModel via an interface named
IViewAware. The intermediary object is an instance of
ActiveAwareUIElementAdapter. This class is used to provide a
UIElement instance with Prisms
IActiveAware interface. It does so by monitoring its Got and LostFocus events.
We then use this class within any
IView UIElement implementation, but in particular the base
ViewControl class. We instantiate the ActiveAwareUIElement adapter within the view's constructor, and pass it the instance of the view itself. The
ActiveAwareUIElement then simply subscribes to the GotFocus and LostFocus events of the view, which is of course a
We see that the dependency property ViewModel, when changed, prompts the attachment of the
ActiveAwareUIElement instance to the ViewModel. The mechanism for performing this is via the
IViewAware implementation. If an
IViewModel wishes to be aware of its view's state, in particular when it becomes active or inactive; without having to have a direct reference to the view, then it can implement the
The ViewModel base class implementation is provided next in full:
So there it is. Just one way to provide a ViewModel with active awareness. Please be aware that this code is preliminary and may be subject to change. The full source code will be available via the Calcium source download page soon.
Thanks to Kent Boogaart for his post on MVVM Infrastructure ActiveAwareCommand which the
ActiveAwareUIElementAdapter was inspired from.