2类继承NotifyPropertyChanged无法更新UI

时间:2014-01-16 14:20:27

标签: c# wpf inheritance inotifypropertychanged

我目前的问题是我的UI没有像我喜欢的那样更新,希望你能帮助我。

我有一个模拟的“2类继承”,如本页所推荐 http://www.codeproject.com/Articles/10072/Simulated-Multiple-Inheritance-Pattern-for-C

我的真实应用程序如下所示:

public class Item : INotifyPropertyChanged
{
   private bool _isVisible;
   public bool IsVisible
   {
      get
      {
         return _isVisible;
      }
      set
      {
         if (_isVisible == value)
            return;

         _isVisible = value;
         OnPropertyChanged("IsVisible");
      }
   }

   //NotifyPropertyChanged Implementation removed so the focus stays on problem...
}

public class ObjectItem : INotifyPropertyChanged
{
   private bool _isExpanded;
   public bool IsExpanded
   {
      get
      {
         return _isExpanded;
      }
      set
      {
         if (_isExpanded== value)
            return;

         _isExpanded= value;
         OnPropertyChanged("IsExpanded");
      }
   }

   //NotifyPropertyChanged Implementation removed so the focus stays on problem...
}

public class CombinedItem : Item
{
   private readonly ObjectItem _objectItem = new ObjectItem();

   public bool IsExpanded
   {
      get { return _objectItem.IsExpanded; }
      set { _objectItem.IsExpanded = value; }
   }

   public static implicit operator ObjectItem(CombinedItem combinedItem)
   {
      return combinedItem._objectItem;
   }
}

我现在面临的问题是,当我将CominedItem作为DataContext时,属性IsExpanded没有正确通知UI,IsVisible属性按预期工作。

为了解决这个问题,我将CominedItem更改为以下内容:

public class CombinedItem : Item
{
   private readonly ObjectItem _objectItem = new ObjectItem();

   public bool IsExpanded
   {
      get { return _objectItem.IsExpanded; }
      set 
      { 
         if (_objectItem.IsExpanded == value)
            return;

         _objectItem.IsExpanded = value;
         OnPropertyChanged("IsExpanded");
      }
   }

   public static implicit operator ObjectItem(CombinedItem combinedItem)
   {
      return combinedItem._objectItem;
   }
}

有没有办法避免再次使用这种方法编写OnPropertyChanged(“IsExpanded”)。 (我知道有一些库/工具,你根本不需要写它,只需要声明一个属性,请不要暗示那些)

2 个答案:

答案 0 :(得分:1)

实际上你应该订阅ObjectItem PropertyChanged并在CombinedItem上引发匹配事件。

如果在不使用CombinedItem.IsExpanded的情况下修改了_objectItem.IsExpanded,则您的UI将看不到更改。

如果要包装属性,如果没有一些魔术属性/工具,则必须处理更改通知。

public class CombinedItem : Item
{
   private readonly ObjectItem _objectItem = new ObjectItem();

   public CombinedItem()
   {
       _objectItem.PropertyChanged += (s, e) => 
       {
           if (e.PropertyName == "IsExpanded")
               OnPropertyChanged("IsExpanded");
       }
   }

   public bool IsExpanded
   {
      get { return _objectItem.IsExpanded; }
      set { _objectItem.IsExpanded = value; }
   }

   public static implicit operator ObjectItem(CombinedItem combinedItem)
   {
      return combinedItem._objectItem;
   }
}

答案 1 :(得分:1)

您可以将ObjectItem公开为属性并绑定到该

public class CombinedItem : Item
{
   private readonly ObjectItem _objectItem = new ObjectItem();

   public bool IsExpanded
   {
      get { return _objectItem.IsExpanded; }
      set { _objectItem.IsExpanded = value; }
   }

   public ObjectItem ObjectItem
   {
      get { return _objectItem; }
   }

   public static implicit operator ObjectItem(CombinedItem combinedItem)
   {
      return combinedItem._objectItem;
   }
}



<Expander IsExpanded={Binding ObjectItem.IsExpanded}/>