Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ADD this variable to the class:
- private INotifyCollectionChanged prevListViewItemsSource;
- public ListViewLayoutManager(ListView listView)
- {
- if ( listView == null )
- {
- throw new ArgumentNullException( "listView" );
- }
- this.listView = listView;
- this.listView.Loaded += new RoutedEventHandler( ListViewLoaded );
- this.listView.Unloaded += new RoutedEventHandler( ListViewUnloaded );
- // ADD from the following lines and methods:
- DependencyPropertyDescriptor dpd =
- DependencyPropertyDescriptor.FromProperty(ListView.ItemsSourceProperty, typeof(ListView));
- dpd.AddValueChanged(this.listView, ListViewItemsSourceChanged);
- ListViewItemsSourceChanged(null, null);
- } // ListViewLayoutManager
- private void ListViewItemsSourceChanged(object sender, EventArgs e)
- {
- if (prevListViewItemsSource != null)
- {
- prevListViewItemsSource.CollectionChanged -= source_CollectionChanged;
- }
- var source = listView.ItemsSource as INotifyCollectionChanged;
- prevListViewItemsSource = source;
- if (source != null)
- {
- source.CollectionChanged += source_CollectionChanged;
- }
- }
- private void source_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
- {
- ResetColumnWidths();
- switch (e.Action)
- {
- case NotifyCollectionChangedAction.Add:
- foreach (object o in e.NewItems)
- {
- var item = o as INotifyPropertyChanged;
- if (item != null)
- {
- item.PropertyChanged += item_PropertyChanged;
- }
- }
- break;
- case NotifyCollectionChangedAction.Remove:
- foreach (object o in e.OldItems)
- {
- var item = o as INotifyPropertyChanged;
- if (item != null)
- {
- item.PropertyChanged -= item_PropertyChanged;
- }
- }
- break;
- case NotifyCollectionChangedAction.Replace:
- foreach (object o in e.OldItems)
- {
- var item = o as INotifyPropertyChanged;
- if (item != null)
- {
- item.PropertyChanged -= item_PropertyChanged;
- }
- }
- foreach (object o in e.NewItems)
- {
- var item = o as INotifyPropertyChanged;
- if (item != null)
- {
- item.PropertyChanged += item_PropertyChanged;
- }
- }
- break;
- case NotifyCollectionChangedAction.Reset:
- var list = sender as IEnumerable;
- if (list != null)
- {
- foreach (object o in list)
- {
- var item = o as INotifyPropertyChanged;
- if (item != null)
- {
- item.PropertyChanged += item_PropertyChanged;
- }
- }
- }
- break;
- }
- }
- private void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
- {
- ResetColumnWidths();
- }
- private void ResetColumnWidths()
- {
- Dispatcher.CurrentDispatcher.BeginInvoke((Action) (() =>
- {
- GridView view = listView.View as GridView;
- if (view != null)
- {
- listView.UpdateLayout(); // Prevent flickering on expanding columns (not collapsing though)
- foreach (GridViewColumn gridViewColumn in view.Columns)
- {
- bool? isFillColumn = RangeColumn.GetRangeIsFillColumn(gridViewColumn);
- if (!isFillColumn.HasValue || !isFillColumn.Value)
- {
- if (double.IsNaN(gridViewColumn.Width))
- {
- gridViewColumn.Width = gridViewColumn.ActualWidth;
- gridViewColumn.Width = double.NaN;
- }
- }
- }
- }
- Dispatcher.CurrentDispatcher.BeginInvoke((Action) Refresh, DispatcherPriority.Render);
- }), DispatcherPriority.Render);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement