raisepropertychanged property example collection change wpf data-binding itemssource

example - wpf inotifypropertychanged



Propiedad personalizada de ItemsSource para un UserControl (2)

Puede que necesites hacer algo como esto bajo tu control.

public IEnumerable ItemsSource { get { return (IEnumerable)GetValue(ItemsSourceProperty); } set { SetValue(ItemsSourceProperty, value); } } public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(UserControl1), new PropertyMetadata(new PropertyChangedCallback(OnItemsSourcePropertyChanged))); private static void OnItemsSourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { var control = sender as UserControl1; if (control != null) control.OnItemsSourceChanged((IEnumerable)e.OldValue, (IEnumerable)e.NewValue); } private void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue) { // Remove handler for oldValue.CollectionChanged var oldValueINotifyCollectionChanged = oldValue as INotifyCollectionChanged; if (null != oldValueINotifyCollectionChanged) { oldValueINotifyCollectionChanged.CollectionChanged -= new NotifyCollectionChangedEventHandler(newValueINotifyCollectionChanged_CollectionChanged); } // Add handler for newValue.CollectionChanged (if possible) var newValueINotifyCollectionChanged = newValue as INotifyCollectionChanged; if (null != newValueINotifyCollectionChanged) { newValueINotifyCollectionChanged.CollectionChanged += new NotifyCollectionChangedEventHandler(newValueINotifyCollectionChanged_CollectionChanged); } } void newValueINotifyCollectionChanged_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { //Do your stuff here. }

¿Alguien sabe cómo hacer un ItemsSource personalizado?

Lo que quiero hacer es crear un itemsSource para mi propio UserControl para que pueda estar vinculado por ObservableCollection<> .

Además, podría saber itemsSource actualizó la cantidad de elementos en los elementos de itemsSource , para realizar procedimientos adicionales.

Muchas gracias.


Use un DependencyProperty ItemsSource en su CustomControl y luego conéctese a esta DependencyProperty

Este es el código XAML (Reconozca el DataContext del ListBox):

<UserControl x:Name="MyControl"> <ListBox DataContext="{Binding ElementName=MyControl}" ItemsSource="{Binding ItemsSource}"> </ListBox> </UserControl>

Este es el CodeBehind:

public partial class MyCustomControl { public IEnumerable ItemsSource { get { return (IEnumerable)GetValue(ItemsSourceProperty); } set { SetValue(ItemsSourceProperty, value); } } public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(ToolboxElementView), new PropertyMetadata(null)); }

Este es el Código, donde usas tu "MyCustomControl":

<Window> <local:MyCustomControl ItemsSource="{Binding MyItemsIWantToBind}"> </local:MyCustomControl> </Window>