绑定以依赖子类的可观察集合

Binding to count on observable collection of subclass

我这里有一个 WPF 绑定问题。

以下设置:

我确实有一个具有名称的 class (ActionService) 和一个子项的 ObservableCollection(还有一个名为 Step 的 class)。步骤有一个标志,显示该步骤是否已完成 (IsDone)。

我将表单绑定到 ActionService 并显示各种内容。

一切都按方面工作,我的代码片段中只有基本部分。

现在我还需要一件我无法工作的东西。我希望 ActionService 通过绑定其打开的步骤数 (IsDone == false) 来了解。如果您使用其中一个步骤打开子窗体并更改 IsDone-State,母窗体应该即时获得新的计数。

我太笨了,无法在途中找到正确的解决方案;-)

感谢您的帮助或最佳实践。

public class ActionService : BaseObject
{
 public ActionService()
 {
 }

 private String name;
 public String Name
 {
  get { return this.name; }
  set
  {
   this.name = value;
   raisePropertyChanged("Name");
  }
 }

 public ObservableCollection<Step> actionsteps;
 public ObservableCollection<Step> ActionSteps
 {
  get { return this.actionsteps; }
  set
  {
   this.actionsteps = value;
   raisePropertyChanged("ActionSteps");
  }
 }
 
}

public class Step : BaseObject
{
 public Step()
 {
 }
 
 private String description;
 public String Description
 {
  get { return this.description; }
  set
  {
   this.description = value;
   raisePropertyChanged("Description");
  }
 }
 
 private Boolean isdone;
 public Boolean IsDone
 {
  get { return this.isdone; }
  set
  {
   this.isdone = value;
   raisePropertyChanged("IsDone");
  }
 }
}

public class BaseObject : INotifyPropertyChanged
{
 public event PropertyChangedEventHandler PropertyChanged;
 
 protected void raisePropertyChanged(String parPropertyName)
 {
  if (this.PropertyChanged != null)
  {
   this.PropertyChanged(this, new PropertyChangedEventArgs(parPropertyName));
  }
 }
}

您可以在 ActionService class 中创建一个新的 属性:

public bool IsDone
    {
        get 
        {
            return ActionSteps.Count(x => x.IsDone) == ActionSteps.Count;
        }
    }

如果 IsDone 属性 为真的 ActionSteps 列表中的步骤数等于 ActionSteps 列表中的步骤数,则 return 为真,否则, return false.

要订阅 Steps 属性 changed 事件,当您将项目添加到集合中时,您只需订阅 PropertyChanged 事件:

//Create the item and subscribe to propertychanged.
Step item = new Step();
item.PropertyChanged += item_PropertyChanged;

//Add the item to the list.
ActionSteps.Add(item);

您的方法将如下所示:

void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "IsDone")
            raisePropertyChanged("IsDone");
    }