Пересвязать элементы управления, используя шаблон PRISM в Silverlight - PullRequest
0 голосов
/ 24 июня 2010

Я пытался работать с библиотекой составных приложений (Prism), и я установил довольно стандартный шаблон, которому я следовал из руководства Microsoft. По сути, представление вводится в регион. Представление создается динамически, добавляя элементы управления и т. Д. Все программно.

У меня есть команда, которая запускается, и при обратной передаче я хотел бы перепривязать элементы управления в текущем представлении, вместо того, чтобы полностью перерисовывать все элементы управления снова.

Поэтому я попытался обновить модель обновленной версией, надеясь, что это приведет к повторному связыванию элементов управления. Это не работает Не уверен, какой подход я должен использовать, потому что я новичок в Призма ...

Есть идеи?

Подписаться на событие для обработки постбэков

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

Проведение мероприятия

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 ...
    } 
}

1 Ответ

0 голосов
/ 25 июня 2010

Я выяснил, как выполнить повторную привязку в соответствии с предлагаемыми шаблонами от Microsoft.

По сути, все, что мне нужно было сделать, это наследовать от INotifyPropertyChanged в моей модели.

Затем, следуя этой схеме, когда моя модель обновляется, она вынуждена перепривязать все элементы управления, вызывая событие, уведомляющее клиента о том, что свойство фактически изменилось.

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 );
    }
}
...