Для начала, вы не подключите PropertyChanged
для его реализации.Идея состоит в том, что WPF использует это событие и связывает его.Единственное, что вы делаете, это запускаете событие, когда это применимо.
И это часть проблемы здесь.У вас есть свойство Editing
, но оно не запускается.Я понимаю, что вы установили PropertyChanged
родительского списка для запуска события, но это не сработает.
Если я правильно понял идею, вы хотите, чтобы когдасвойство Editing
списка изменяется, вы хотите, чтобы PropertyChanged
элемента списка был принудительно принудительным.
Одна из особенностей PropertyChanged
заключается в том, что отправитель имеет быть объектом, где находится PropertyChanged
.Это означает, что вы должны реализовать это следующим образом:
public partial class EditableListBox : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
// You really should make this protected. You do not want the outside world
// to be able to fire PropertyChanged events for your class.
protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private bool _editing;
public bool Editing
{
get
{
return _editing;
}
set
{
_editing = value;
NotifyPropertyChanged("Editing");
}
}
}
public class EditableListItem : INotifyPropertyChanged
{
private EditableListBox _parentListBox;
public EditableListItem(EditableListBox parentListBox)
{
_parentListBox = parentListBox;
_parentListBox.PropertyChanged += new PropertyChangedEventHandler(_parentListBox_PropertyChanged);
}
void _parentListBox_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
// Forward the event.
if (e.PropertyName == "Editing")
NotifyPropertyChanged("Editing");
}
public event PropertyChangedEventHandler PropertyChanged;
// You really should make this protected. You do not want the outside world
// to be able to fire PropertyChanged events for your class.
protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public bool Editing
{
get
{
return _parentListBox.Editing;
}
}
}
Я не знаю, как вы получаете ссылку на редактируемый список, но допустим, что вы получаете его через конструктор.Когда вы получаете ссылку, вы присоединяете обработчик события PropertyChanged
к списку.Потому что, когда свойство Editing
этого объекта изменяется, собственно, ваше свойство Editing
также изменяется.Вот как вы имитируете это.
И еще одна вещь: причина, по которой PropertyChanged
по-прежнему null
после += PropertyChanged
, заключается в том, что PropertyChanged
самого объекта равно нулю.Вы не можете связать события таким образом.Второй способ - это правильный способ связывания событий, и приведенный выше пример показывает, что вы делаете с этим.