C# 绑定以计数子类的可观察集合

C# 绑定以计数子类的可观察集合,c#,wpf,binding,C#,Wpf,Binding,我这里确实有一个WPF绑定问题 以下设置: 我确实有一个类(ActionService),它有一个名称和一个子项的ObservableCollection(也是一个名为Step的类)。步骤有一个标志,显示该步骤是否已全部就绪完成(IsDone) 我将表单绑定到ActionService并显示所有类型的内容 一切都是按方面进行的,我的代码片段中只有基本的部分 现在我还需要一件我找不到工作的东西。我希望ActionService通过绑定知道有多少步骤是打开的(IsDone==false)。如果您使用

我这里确实有一个WPF绑定问题

以下设置:

我确实有一个类(ActionService),它有一个名称和一个子项的ObservableCollection(也是一个名为Step的类)。步骤有一个标志,显示该步骤是否已全部就绪完成(IsDone)

我将表单绑定到ActionService并显示所有类型的内容

一切都是按方面进行的,我的代码片段中只有基本的部分

现在我还需要一件我找不到工作的东西。我希望ActionService通过绑定知道有多少步骤是打开的(IsDone==false)。如果您使用其中一个步骤打开子窗体并更改IsDone状态,则母窗体应立即获得新计数

而我在途中却愚蠢到无法得到正确的解决方案;-)

感谢您的帮助或最佳实践

公共类ActionService:BaseObject
{
公共行动服务
{
}
私有字符串名称;
公共字符串名
{
获取{返回this.name;}
设置
{
this.name=值;
RaiseProperty变更(“名称”);
}
}
公开收集行动步骤;
公共可观察收集操作步骤
{
获取{返回this.actionsteps;}
设置
{
this.actionsteps=值;
raisePropertyChanged(“操作步骤”);
}
}
}
公共类步骤:BaseObject
{
公共步骤()
{
}
私有字符串描述;
公共字符串描述
{
获取{返回this.description;}
设置
{
这个。描述=值;
RaiseProperty变更(“说明”);
}
}
专用布尔isdone;
公共布尔IsDone
{
获取{返回this.isdone;}
设置
{
this.isdone=值;
raisePropertyChanged(“IsDone”);
}
}
}
公共类BaseObject:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
受保护的void raisePropertyChanged(字符串parPropertyName)
{
if(this.PropertyChanged!=null)
{
this.PropertyChanged(this,newpropertyChangedEventArgs(parPropertyName));
}
}

}
您可以在
ActionService
类中创建新属性:

public bool IsDone
    {
        get 
        {
            return ActionSteps.Count(x => x.IsDone) == ActionSteps.Count;
        }
    }
如果IsDone属性为true的ActionSteps列表中的步骤数等于ActionSteps列表中的步骤数,则返回true,否则返回false

要订阅Steps property changed事件,向集合中添加项目时,只需订阅property changed事件:

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

并侦听每个操作步骤的属性更改IsOne属性,当它更改时,重新获取IsDone@Muds:如何侦听可观察集合中类的属性更改事件?这是我丢失的链接;-)首先,您可以在集合中侦听collection changed事件,然后如果添加了一个新项,则对新添加项的属性changed执行+=事件处理程序,如果删除了一个项,则删除该事件。。有道理吗?@Muds:对不起,我不明白。你能提供一个简短的代码片段吗。我会非常感激的。MikeI编辑了我的答案,解释了当集合中任何项的IsOne属性发生更改时,如何调用property changed事件。如果清楚的话,请告诉我。