Note that there are some explanatory texts on larger screens.

plurals
  1. POBindingList<T> INotifyPropertyChanged unexpected behavior
    primarykey
    data
    text
    <p>Suppose, I have objects:</p> <pre><code>public interface ITest { string Data { get; set; } } public class Test1 : ITest, INotifyPropertyChanged { private string _data; public string Data { get { return _data; } set { if (_data == value) return; _data = value; OnPropertyChanged("Data"); } } protected void OnPropertyChanged(string propertyName) { var h = PropertyChanged; if (null != h) h(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; } </code></pre> <p>and its holder:</p> <pre><code> private BindingList&lt;ITest&gt; _listTest1; public BindingList&lt;ITest&gt; ListTest1 { get { return _listTest1 ?? (_listTest1 = new BindingList&lt;ITest&gt;() { RaiseListChangedEvents = true }); } } </code></pre> <p>Also, I subscribe to ListChangedEvent</p> <pre><code> public MainWindow() { InitializeComponent(); ListTest1.ListChanged += new ListChangedEventHandler(ListTest1_ListChanged); } void ListTest1_ListChanged(object sender, ListChangedEventArgs e) { MessageBox.Show("ListChanged1: " + e.ListChangedType); } </code></pre> <p>And 2 test handlers: For adding object</p> <pre><code> private void AddITestHandler(object sender, RoutedEventArgs e) { ListTest1.Add(new Test1 { Data = Guid.NewGuid().ToString() }); } </code></pre> <p>and for changing</p> <pre><code> private void ChangeITestHandler(object sender, RoutedEventArgs e) { if (ListTest1.Count == 0) return; ListTest1[0].Data = Guid.NewGuid().ToString(); //if (ListTest1[0] is INotifyPropertyChanged) // MessageBox.Show("really pch"); } </code></pre> <p>ItemAdded occurs, but ItemChanged not. Inside seeting proprty "Data" I found that no subscribers for my event PropertyChanged:</p> <pre><code> protected void OnPropertyChanged(string propertyName) { var h = PropertyChanged; // h is null! why?? if (null != h) h(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; </code></pre> <p>Digging deeper i took reflector and discover BindingList:</p> <pre><code> protected override void InsertItem(int index, T item) { this.EndNew(this.addNewPos); base.InsertItem(index, item); if (this.raiseItemChangedEvents) { this.HookPropertyChanged(item); } this.FireListChanged(ListChangedType.ItemAdded, index); } private void HookPropertyChanged(T item) { INotifyPropertyChanged changed = item as INotifyPropertyChanged; if (changed != null) // Its seems like null reference! really?? { if (this.propertyChangedEventHandler == null) { this.propertyChangedEventHandler = new PropertyChangedEventHandler(this.Child_PropertyChanged); } changed.PropertyChanged += this.propertyChangedEventHandler; } } </code></pre> <p>Where am I wrong? Or this is known bug and i need to find some workaround? Thanks!</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload