empo
empo

Reputation: 1163

C# - How do I change the value of a property based on changes to another property (ObservableCollection)?

How do I change the value of TotalPublicationsRead, when the Read property of a Publication has changed?

public class Report
{
   public ObservableCollection<Publication> Publications { get; set; }
   public int TotalPublicationsRead { get; set; }
}

public class Publication : INotifyPropertyChanged
{
   private bool read;
   public bool Read 
   { 
      get { return this.read; }
      set
      {
         if (this.read!= value)
         {
             this.publications = value;
             OnPropertyChanged("Read");
         }
      }
   }

   #region INotifyPropertyChanged Members

   public event PropertyChangedEventHandler PropertyChanged;

   #endregion

   private void OnPropertyChanged(string property)
   {
       if (this.PropertyChanged != null)
       {
           PropertyChanged(this, new PropertyChangedEventArgs(property));
       }
   }           
}

Thanks in advance.

Upvotes: 4

Views: 12521

Answers (2)

Teoman shipahi
Teoman shipahi

Reputation: 23102

You can use Dependency Property.

Please check details at: http://www.wpftutorial.net/dependencyproperties.html http://msdn.microsoft.com/en-us/library/ms745795(v=vs.110).aspx

Upvotes: 0

Jon Mitchell
Jon Mitchell

Reputation: 3429

If you're trying to do what I think you are, then I'd change the TotalPublicationsRead property and forget about the events. In the code below I just count the items in the list where the Publication has been Read.

The way you were trying to do it you would have to have an event handler for when the ObserableCollection changed. Then you would have to attach an event handler to the PropertyChanged event which would increment or decrement the TotalPublicationsRead property. I'm sure it would work, but it would be a lot more complicated.

public class Report
{
    public List<Publication> Publications { get; set; }
    public int TotalPublicationsRead 
    {
        get 
        { 
            return this.Publications.Count(p => p.Read); 
        }
    }

}

public class Publication : INotifyPropertyChanged
{
    private bool read;
    public bool Read
    {
        get { return this.read; }
        set { this.read = value; }
    }
}

Upvotes: 6

Related Questions