如何更改子视图模型属性时如何通知父视图模型?

时间:2015-11-23 08:18:21

标签: c# wpf

我有一个窗口说

  1. PhotoAlbums(父窗口)
  2. PhotoAlbumProperty(儿童)
  3. 在相册窗口中,我有相册列表的组合框,NewAlbum按钮,保存按钮,属性按钮。

    我想在我的PhotoAlbum处于编辑模式时启用保存按钮。 当我在相册中添加新照片时,PhotoAlbum将进入编辑模式;如果我通过单击属性按钮更改属性,则将进入。

    我有属性,

    PhotoAlbumVM中的

    IsPhotoAlbumUpdated

    PhotoAlbumPropertyVM中的

    IsPhotoAlbumPropertyUpdated

    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知道这个?

    我正在考虑使用棱镜事件,但是为了做这么小的事情,我不想使用棱镜事件。

    请建议我替代逻辑。

2 个答案:

答案 0 :(得分:0)

您需要侦听子项目的OnPropertyChanged事件。每次更改SelectedAlbum时,set都会从旧相册中删除处理程序,除非使用album.PropertyChanged -= MyPropertyChanged为空,并使用value.PropertyChanged += MyPropertyChanged将处理程序分配给新值。在MyPropertyChanged强制更新IsSaveEnabled的新值。

答案 1 :(得分:0)

您可以在CollectionChanged上订阅PropertyChanged个事件到集合项目。如果您的UI正确绑定到ObservableCollection中的项目,那么当集合中项目的属性发生更改时,您不需要告知UI更新。如果必须做一致的行为,您可以执行特定对象的集合或使用以下实现在应用程序中执行此操作。

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