I am passing a collection to UseSimpleClass. I would like UseSimpleClass property SimpleClassColCountChecked get to fire in when a value in a collection passed to UseSimpleClass changes.
In real life the collection is some user preferences and as they page through a useSimpleClass collection I want to preserve their preferences.
public partial class MainWindow : Window, INotifyPropertyChanged
{
private UseSimpleClass useSimpleClass;
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public MainWindow()
{
InitializeComponent();
List<SimpleClass> simpleCollection = new List<SimpleClass>();
simpleCollection.Add(new SimpleClass());
simpleCollection.Add(new SimpleClass());
simpleCollection.Add(new SimpleClass());
useSimpleClass = new UseSimpleClass(simpleCollection);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
useSimpleClass.SimpleClassCol[1].Checked = true;
}
}
public class SimpleClass : INotifyPropertyChanged
{
private bool _checked = false;
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public bool Checked
{
get { return _checked; }
set
{
_checked = value;
NotifyPropertyChanged("Checked");
// clearly the next line does not work but that is what I want
NotifyPropertyChanged("SimpleClassColCountChecked");
}
}
}
public class UseSimpleClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public List<SimpleClass> SimpleClassCol { get; private set; }
public Int32 SimpleClassColCountChecked
{
get
{
return (SimpleClassCol.Where(sc => sc.Checked).Count());
}
}
public UseSimpleClass (List<SimpleClass> simpleClassCol)
{ SimpleClassCol = simpleClassCol; }
}
This way, you can handle PropertyChanged event of SimpleClass in UseSimpleClass.
For each item in source (simpleClassCol) you start listening for PropertyChanged event. May be it is not so expensive.
If it will be a ListBox (ListView), you can use SelectedItems collection to achive such behavior. So you will need two collection – first will contain whole items, second – selected items.
EDIT:
The main part I forgot – is that you should specify DataContext of your MainWindow
so, in the code behind