In many cases the data that you work with is a collection of objects. For example,
a common scenario in data binding is to use an
ItemsControl
such as a
ListBox,
ListView,
or
TreeView
to display a collection of records.
You can enumerate over any collection that implements the
IEnumerable
interface. However, to set up dynamic bindings so that insertions or deletions in
the collection update the UI automatically, the collection must implement the
INotifyCollectionChanged interface. This
interface exposes the
CollectionChanged event, an event that
should be raised whenever the underlying collection changes.
WPF provides the
ObservableCollection<(Of <(T>)>)
class, which is a built-in implementation of a data collection that implements the
INotifyCollectionChanged interface.
Before implementing your own collection, consider using
ObservableCollection<(Of <(T>)>)
or one of the existing collection classes, such as
List<(Of <(T>)>),
Collection<(Of <(T>)>),
and
BindingList
<(Of
<(T>)>), among many others. If you have an advanced
scenario and want to implement your own collection, consider using
IList,
which provides a non-generic collection of objects that can be individually accessed
by index. Implementing
IList
provides the best performance with the data binding engine.
Note:
|
|
To fully support transferring data values from binding source objects to binding
targets, each object in your collection that supports bindable properties must implement
an appropriate property changed notification mechanism such as the
INotifyPropertyChanged
interface.
|
For more information, see "Binding to Collections" in
Data Binding Overview.
Notes on XAML Usage
ObservableCollection<(Of <(T>)>)
can be used as a XAML object element in Windows Presentation Foundation (WPF), in
versions 3.0 and 3.5. However, the usage has substantial limitations.
-
ObservableCollection<(Of <(T>)>)
must be the root element, because the
x:TypeArguments attribute
that must be used to specify the constrained type of the generic
ObservableCollection<(Of <(T>)>)
is only supported on the object element for the root element.
-
You must declare an
x:Class attribute
(which entails that the build action for this XAML file must be Page or some other build action
that compiles the XAML).
-
ObservableCollection<(Of <(T>)>)
is in a namespace and assembly that are not initially mapped to the default XML
namespace. You must map a prefix for the namespace and assembly, and then use that
prefix on the object element tag for
ObservableCollection<(Of <(T>)>).
A more straightforward way to use
ObservableCollection<(Of <(T>)>)
capabilities from XAML in an application is to declare your own non-generic custom
collection class that derives from
ObservableCollection<(Of <(T>)>),
and constrains it to a specific type. Then map the assembly that contains this class,
and reference it as an object element in your XAML.