2015-11-23 1 views
3

У меня есть окна сказатьКак уведомить модель представления родителя при изменении свойства модели представления ребенка?

  1. фотоальбомов (Родительское окно)
  2. PhotoAlbumProperty (ребенок)

В окне Фотоальбомы У меня есть поле со списком в списке фотоальбомов, кнопка NewAlbum, кнопку Сохранить , кнопка свойства.

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

У меня есть свойства,

IsPhotoAlbumUpdated в PhotoAlbumVM

IsPhotoAlbumPropertyUpdated в PhotoAlbumPropertyVM

IsSaveEnabled 
{ 
    get return this.IsPhotoAlbumUpdated || this.SelectedAlbum.IsPhotoAlbumPropertyUpdated; 
} 

in PhotoAlbumVM 

<Button Name="BtnSave" Command="{Binding Save}" 
        ToolTip="{x:Static resx:Resource.ToolTipSave}" Focusable="True" 
        IsEnabled="{Binding IsSaveEnabled}"> 

Теперь, когда this.SelectedAlbum.IsPhotoAlbumPropertyUpdated получает изменил то, как будет мой родительский вид модели, т.е. PhotoAlbumVM это знать?

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

Пожалуйста, предложите мне альтернативную логику.

+1

Event Aggregator - это не очень сложно. См. Легкую, простую и полезную версию Event Aggregator от @Rachel: https://rachel53461.wordpress.com/2011/10/09/simplifying-prisms-eventaggregator/ – StepUp

+0

Да, я это реализовал. это приводит к проблеме производительности, мы уже использовали это в нашем приложении во многих местах. –

ответ

0

Вам необходимо прослушать событие OnPropertyChanged дочернего элемента. Каждый раз, когда SelectedAlbum изменен, в set удалите обработчик из старого альбома, если он не равен нулю, используя album.PropertyChanged -= MyPropertyChanged и назначив обработчик новому значению с помощью value.PropertyChanged += MyPropertyChanged. В MyPropertyChanged сила обновить новое значение IsSaveEnabled.

0

Вы можете подписаться на события PropertyChanged в коллекции элементов CollectionChanged. Предоставление вашего пользовательского интерфейса правильно привязывается к элементам ObservableCollection, вам не нужно указывать, что пользовательский интерфейс будет обновляться при изменении свойства элемента в коллекции. Вы можете сделать сборку определенного объекта или использовать приведенную ниже реализацию, чтобы сделать это через приложение, если вам нужно сделать последовательное поведение.

using System.ComponentModel; 
using System.Collections.ObjectModel; 
using System.Collections.Specialized; 
using System.Collections; 

namespace VJCollections 
{ 
    /// <summary> 
    ///  This class adds the ability to refresh the list when any property of 
    ///  the objects changes in the list which implements the INotifyPropertyChanged. 
    /// </summary> 
    /// <typeparam name="T"> 
    public class ItemsChangeObservableCollection<T> : 
      ObservableCollection<T> where T : INotifyPropertyChanged 
    { 
     protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
     { 
      if (e.Action == NotifyCollectionChangedAction.Add) 
      { 
       RegisterPropertyChanged(e.NewItems); 
      } 
      else if (e.Action == NotifyCollectionChangedAction.Remove) 
      { 
       UnRegisterPropertyChanged(e.OldItems); 
      } 
      else if (e.Action == NotifyCollectionChangedAction.Replace) 
      { 
       UnRegisterPropertyChanged(e.OldItems); 
       RegisterPropertyChanged(e.NewItems); 
      } 

      base.OnCollectionChanged(e); 
     } 

     protected override void ClearItems() 
     { 
      UnRegisterPropertyChanged(this); 
      base.ClearItems(); 
     } 

     private void RegisterPropertyChanged(IList items) 
     { 
      foreach (INotifyPropertyChanged item in items) 
      { 
       if (item != null) 
       { 
        item.PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged); 
       } 
      } 
     } 

     private void UnRegisterPropertyChanged(IList items) 
     { 
      foreach (INotifyPropertyChanged item in items) 
      { 
       if (item != null) 
       { 
        item.PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged); 
       } 
      } 
     } 

     private void item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      base.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 
     } 
    } 
} 
+1

@Mohini Mhetre - ваша проблема решена? – user1672994

+0

Я думаю, что призма будет хорошим вариантом для меня. –

Смежные вопросы