I have a datagrid. One column is a checkbox and I would like to handle when the checkbox of a row is modified.
I have seen this code, that at first it looks what I am looking for, but I have some doubts.
public ObservableCollection<YourDataType> Items
{
get { return items; }
set { items = value; NotifyPropertyChanged("Items"); }
}
public YourDataType SelectedItem
{
get { return selectedItem; }
set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); }
}
In the view model constructor:
SelectedItem.PropertyChanged = SelectedItem_PropertyChanged;
In the view model:
private void SelectedItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
// this will be called when any property value of the SelectedItem object changes
if (e.PropertyName == "YourPropertyName") DoSomethingHere();
else if (e.PropertyName == "OtherPropertyName") DoSomethingElse();
}
My doubt is that in the constructor it is subscribe to the event of the selected item, but the selected item is changed when I select another row in the datagrid. So is it subscribe only once? To which item?
Also, the selected item is null at constructor time, so I guess I will get an null error, I guess.
So I really I am not sure if this really a good solution, and if it is, I don't understand why it can work.
There is another solution to can handle when a property of one of the items in the datagrid is changed? But at first, this solution seems clear and simple.
Thanks.
CodePudding user response:
You would have to attach and detach the event handler in the SelectedItem property setter:
public YourDataType SelectedItem
{
get { return selectedItem; }
set
{
if (selectedItem != null)
{
selectedItem.PropertyChanged -= SelectedItem_PropertyChanged;
}
selectedItem = value;
if (selectedItem != null)
{
selectedItem.PropertyChanged = SelectedItem_PropertyChanged;
}
NotifyPropertyChanged(nameof(SelectedItem));
}
}