wpfdata-bindingbindingcollections

WPF Collections and Databinding


I am new to WPF and trying to wrap my head around WPF's framework, what it does and does not do for you.

To clarify this, I would like to know what is the difference between this:

public List<MyCustomObject> MyCustomObjects
{
    get { return (List<MyCustomObject>)GetValue(MyCustomObjectsProperty); }
    set { SetValue(MyCustomObjectsProperty, value); }
}

public static readonly DependencyProperty MyCustomObjectsProperty =
    DependencyProperty.Register("MyCustomObjects", typeof(List<MyCustomObject>),
    typeof(Main), new UIPropertyMetadata(new List<MyCustomObject>()));



and this:

public ObservableCollection<MyCustomObject> MyCustomObjects { get; set; }

public Main ()
{
    MyCustomObjects = new ObservableCollection<<MyCustomObject>();
}

Solution

  • 1:

    You're using a dependency property to "tell" the framework when that property is changed. This will have the following consequences for your binding:

    MyCustomObjects.Add(new MyCustomObject()); //Wont update the view through databinding
    MyCustomObjects = new List<MyCustomObject>(); //Will update the view through databinding
    

    You could gain the same databinding functionality by implementing INotifyPropertyChanged on which ever class exposes the property, but dependency properties a capable of much more than just notifying about changes. These are rather advanced features though, which you aren't likely to come across in your average joe app :)

    2:

    You're using an observable collection, which implements INotifyCollectionChanged for you, to tell the databinding whenever the content of the collection has changed. This will have the opposite consequences than #1:

    MyCustomObjects.Add(new MyCustomObject()); //Will update the view through databinding
    MyCustomObjects = new ObservableCollection<MyCustomObject>(); //Won't update the view through databinding