We have seen that the infrastructure has a way, by default based on behaviors, to notify a ViewModel that its own view state is changing.

The View is a Window

If the view is a window we have several state that can be handled/intercepted by the coupled ViewModel:

  • Loaded;
  • Activated;
  • Shown;
  • Closing;
  • Closed;

The View is a FrameworkElement (e.g. a UserControl)

If the view is a “poor” user control the only state we can intercept is the Loaded event.

How to

A view model that needs to intercept state changes can implement a interface that declares what are the required callback(s), the supported interfaces are:

  • IExpectViewLoadedCallback;
  • IExpectViewActivatedCallback;
  • IExpectViewShownCallback;
  • IExpectViewClosingCallback;
  • IExpectViewClosedCallback;

All those interfaces are pretty trivial and does not require any further explanation other then the following sample:

class SampleViewModel : IExpectViewLoadedCallback
{
void IExpectViewLoadedCallback.OnViewLoaded()
{
//code to handle the View Loaded event
}
}

The only “special” one is the IExpectViewClosingCallback that allows the view model to ask to the view to stop the closing process:

class ChildViewModel : AbstractViewModel, IExpectViewClosingCallback
{
void IExpectViewClosingCallback.OnViewClosing( CancelEventArgs e )
{
//blocks the view closing process
e.Cancel = true;
}
}

Those interfaces are designed to let the view model to intercept the state changes of its own view not of other view, the default way to intercept state changes of other view is to use the MessageBroker.

Last edited Nov 6, 2012 at 12:37 PM by topics, version 3

Comments

No comments yet.