views:

29

answers:

1

I have been trying to work with the Composite Application Library (Prism) and I have set up a pretty standard pattern that I have followed off Microsoft's tutorial. Basically, the View is injected into the Region. The View is dynamically built, adding controls and so forth all programmatically.

I have a command that gets fired and on postback I would like to rebind the controls on the current view, instead of completely re-rendering all the controls over again.

So I tried updating the model with the updated version hoping that would force a rebinding of controls. That doesn't work. Not sure what approach I should be taking, for I am new to Prism...

Any ideas?

Subscribe an event to handle postbacks

IEventAggregator aggregator = this.Container.Resolve<IEventAggregator>();
aggregator.GetEvent<DataInstanceLoadedEvent>().Subscribe(this.OnDataInstanceUpdated);

Implementation of the event

public void OnDataInstanceUpdated(DataInstance updatedInstance)
{
    if(this.View.Model != null){
       // We need to rebind here 
       IRegion region = this.LocateRegion(this.View); // gets the region....
       this.View.Model.CurrentDataInstance = updatedInstance; // update the model instance
    }
    else{
       // Render all controls over again since view.model is null ...
    } 
}
A: 

I have figured out how to rebind according to the suggested patterns from Microsoft.

Basically, all I had to do was inherit from INotifyPropertyChanged on my Model.

Then following this pattern, once my model updates it is then forced to rebind all the controls by firing an event that notifies the client that the property has in fact changed.

public class MyModel : INotifyPropertyChanged
{
    private DataInstance currentDataInstance;
    public event PropertyChangedEventHandler PropertyChanged;
    public DataInstance CurrentDataInstance
    {
        get
        {
            return this.currentDataInstance;
        }
        set
        {
            if ( this.currentDataInstance == value )
                return;
            this.currentDataInstance = value;
            this.OnPropertyChanged( new PropertyChangedEventArgs("CurrentDataInstance"));
        }
    }
    protected virtual void OnPropertyChanged( PropertyChangedEventArgs e )
    {
        if ( this.PropertyChanged != null )
            this.PropertyChanged( this, e );
    }
}
gmcalab