2015-03-19 133 views
2

我在这里有一个WPF绑定问题。绑定到可观察子类集

以下设置:

我有有一个名字和子项的的ObservableCollection(还有个叫步骤类)类(ActionService)。一个步骤有一个标志,显示该步骤是否已完成(IsDone)。

我将表单绑定到ActionService并显示所有类型的东西。

一切工作正常,我只是在我的片段中的关键部分。

现在我需要一件事,我无法工作。我想通过绑定知道ActionService有多少个步骤已打开(IsDone == false)。我通过其中一个步骤打开一个孩子表格并更改IsDone-State,母亲表格应该即时获得新的计数。

而且我哑得到的方式;-)

感谢您的帮助或最佳实践正确的解决方案。

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

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

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

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

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

回答

1

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

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

如果步在ActionSteps列表中的计数,其中IsDone属性为true等于ActionSteps列表中的步数,然后返回true,否则返回false。

要订阅的步骤属性更改事件,当你添加一个项目到集合中,你只需要订阅的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"); 
    } 
+0

并听取每个操作步骤IsDone属性属性发生变化,当它改变时,重新获得IsDone – Muds 2015-03-19 08:52:14

+0

@Muds:我如何听我的一个安装前后一类的属性更改事件vable集合?多数民众赞成我的失踪链接;-) – Mike 2015-03-19 08:59:00

+0

好,你可以先收听集合中的集合更改事件,然后如果添加一个新的项目,新增加的项目的属性更改+ +事件处理程序,如果项目被删除,删除该事件.. 说得通 ? – Muds 2015-03-19 09:03:59