Improve the property of the DataGrid for subscribing to property changed. Now it controls the subscription only of the nested items. The parent is subscribed as expected if it is INotifyPropertyChanged.
This commit is contained in:
Родитель
03ae84f5fc
Коммит
cfaf4ac526
|
@ -61,6 +61,14 @@ namespace Telerik.Data.Core
|
|||
|
||||
foreach (var item in collectionView)
|
||||
{
|
||||
if (!this.supportsPropertyChangedInitialized)
|
||||
{
|
||||
this.itemSupportsPropertyChanged = item is INotifyPropertyChanged;
|
||||
this.supportsPropertyChangedInitialized = true;
|
||||
}
|
||||
|
||||
this.AddPropertyChangedHandler(item);
|
||||
|
||||
if (!isSourceGrouped)
|
||||
{
|
||||
this.internalList.Add(item);
|
||||
|
@ -185,7 +193,7 @@ namespace Telerik.Data.Core
|
|||
{
|
||||
string propertyName = ((PropertyChangedEventArgs)args).PropertyName;
|
||||
NestedPropertyInfo info;
|
||||
if (this.nestedObjectInfos.TryGetValue(sender, out info))
|
||||
if (this.nestedObjectInfos != null && this.nestedObjectInfos.TryGetValue(sender, out info))
|
||||
{
|
||||
this.NestedPropertyChanged(sender, info.rootItems, propertyName, info.nestedPropertyPath);
|
||||
PropertyChangedEventArgs arguments = new PropertyChangedEventArgs(info.nestedPropertyPath + propertyName);
|
||||
|
@ -197,7 +205,7 @@ namespace Telerik.Data.Core
|
|||
}
|
||||
else
|
||||
{
|
||||
if (this.nestedObjectInfos.Count > 0)
|
||||
if (this.nestedObjectInfos != null && this.nestedObjectInfos.Count > 0)
|
||||
{
|
||||
this.NestedPropertyChanged(sender, new HashSet<object> { sender }, propertyName);
|
||||
}
|
||||
|
@ -209,7 +217,7 @@ namespace Telerik.Data.Core
|
|||
}
|
||||
}
|
||||
|
||||
void IDataSourceView.SubscribeToItemPropertyChanged()
|
||||
void IDataSourceView.SubscribeToNestedItemPropertyChanged()
|
||||
{
|
||||
this.shouldSubsribeToPropertyChanged = true;
|
||||
if (this.nestedObjectInfos == null)
|
||||
|
@ -220,17 +228,14 @@ namespace Telerik.Data.Core
|
|||
for (int i = 0; i < this.internalList.Count; i++)
|
||||
{
|
||||
object item = this.internalList[i];
|
||||
this.RemovePropertyChangedHandler(item);
|
||||
this.SubscribeToINotifyPropertyChanged(item, item, string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
void IDataSourceView.UnsubscribeFromItemPropertyChanged()
|
||||
void IDataSourceView.UnsubscribeFromNestedItemPropertyChanged()
|
||||
{
|
||||
this.shouldSubsribeToPropertyChanged = false;
|
||||
foreach (var item in this.internalList)
|
||||
{
|
||||
this.RemovePropertyChangedHandler(item);
|
||||
}
|
||||
|
||||
if (this.nestedObjectInfos != null)
|
||||
{
|
||||
|
@ -240,6 +245,7 @@ namespace Telerik.Data.Core
|
|||
}
|
||||
|
||||
this.nestedObjectInfos.Clear();
|
||||
this.nestedObjectInfos = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -453,16 +459,13 @@ namespace Telerik.Data.Core
|
|||
{
|
||||
this.internalList.Insert(newIndex, newItem);
|
||||
|
||||
if (this.shouldSubsribeToPropertyChanged)
|
||||
if (this.shouldSubsribeToPropertyChanged && this.nestedObjectInfos != null && this.nestedObjectInfos.Count > 0)
|
||||
{
|
||||
if (this.nestedObjectInfos != null && this.nestedObjectInfos.Count > 0)
|
||||
{
|
||||
this.SubscribeToINotifyPropertyChanged(newItem, newItem, string.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.AddPropertyChangedHandler(newItem);
|
||||
}
|
||||
this.SubscribeToINotifyPropertyChanged(newItem, newItem, string.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.AddPropertyChangedHandler(newItem);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -494,16 +497,13 @@ namespace Telerik.Data.Core
|
|||
{
|
||||
this.internalList[index] = newItem;
|
||||
|
||||
if (this.shouldSubsribeToPropertyChanged)
|
||||
if (this.shouldSubsribeToPropertyChanged && this.nestedObjectInfos != null && this.nestedObjectInfos.Count > 0)
|
||||
{
|
||||
if (this.nestedObjectInfos != null && this.nestedObjectInfos.Count > 0)
|
||||
{
|
||||
this.SubscribeToINotifyPropertyChanged(newItem, newItem, string.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.AddPropertyChangedHandler(newItem);
|
||||
}
|
||||
this.SubscribeToINotifyPropertyChanged(newItem, newItem, string.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.AddPropertyChangedHandler(newItem);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -515,7 +515,7 @@ namespace Telerik.Data.Core
|
|||
this.supportsPropertyChangedInitialized = true;
|
||||
}
|
||||
|
||||
if (this.itemSupportsPropertyChanged && this.shouldSubsribeToPropertyChanged)
|
||||
if (this.itemSupportsPropertyChanged)
|
||||
{
|
||||
this.propertyChangedEventHandler.Subscribe(item);
|
||||
}
|
||||
|
|
|
@ -42,6 +42,13 @@ namespace Telerik.Data.Core
|
|||
|
||||
foreach (var item in enumerableSource)
|
||||
{
|
||||
if (!this.supportsPropertyChangedInitialized)
|
||||
{
|
||||
this.itemSupportsPropertyChanged = item is INotifyPropertyChanged;
|
||||
this.supportsPropertyChangedInitialized = true;
|
||||
}
|
||||
|
||||
this.AddPropertyChangedHandler(item);
|
||||
this.internalList.Add(item);
|
||||
}
|
||||
|
||||
|
@ -124,7 +131,7 @@ namespace Telerik.Data.Core
|
|||
{
|
||||
string propertyName = ((PropertyChangedEventArgs)args).PropertyName;
|
||||
NestedPropertyInfo info;
|
||||
if (this.nestedObjectInfos.TryGetValue(sender, out info))
|
||||
if (this.nestedObjectInfos != null && this.nestedObjectInfos.TryGetValue(sender, out info))
|
||||
{
|
||||
this.NestedPropertyChanged(sender, info.rootItems, propertyName, info.nestedPropertyPath);
|
||||
PropertyChangedEventArgs arguments = new PropertyChangedEventArgs(info.nestedPropertyPath + propertyName);
|
||||
|
@ -136,7 +143,7 @@ namespace Telerik.Data.Core
|
|||
}
|
||||
else
|
||||
{
|
||||
if (this.nestedObjectInfos.Count > 0)
|
||||
if (this.nestedObjectInfos != null && this.nestedObjectInfos.Count > 0)
|
||||
{
|
||||
this.NestedPropertyChanged(sender, new HashSet<object> { sender }, propertyName);
|
||||
}
|
||||
|
@ -147,7 +154,7 @@ namespace Telerik.Data.Core
|
|||
}
|
||||
}
|
||||
|
||||
void IDataSourceView.SubscribeToItemPropertyChanged()
|
||||
void IDataSourceView.SubscribeToNestedItemPropertyChanged()
|
||||
{
|
||||
this.shouldSubsribeToPropertyChanged = true;
|
||||
if (this.nestedObjectInfos == null)
|
||||
|
@ -158,17 +165,14 @@ namespace Telerik.Data.Core
|
|||
for (int i = 0; i < this.internalList.Count; i++)
|
||||
{
|
||||
object item = this.internalList[i];
|
||||
this.RemovePropertyChangedHandler(item);
|
||||
this.SubscribeToINotifyPropertyChanged(item, item, string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
void IDataSourceView.UnsubscribeFromItemPropertyChanged()
|
||||
void IDataSourceView.UnsubscribeFromNestedItemPropertyChanged()
|
||||
{
|
||||
this.shouldSubsribeToPropertyChanged = false;
|
||||
foreach (var item in this.internalList)
|
||||
{
|
||||
this.RemovePropertyChangedHandler(item);
|
||||
}
|
||||
|
||||
if (this.nestedObjectInfos != null)
|
||||
{
|
||||
|
@ -370,16 +374,13 @@ namespace Telerik.Data.Core
|
|||
{
|
||||
this.internalList.Insert(newIndex, newItem);
|
||||
|
||||
if (this.shouldSubsribeToPropertyChanged)
|
||||
if (this.shouldSubsribeToPropertyChanged && this.nestedObjectInfos != null && this.nestedObjectInfos.Count > 0)
|
||||
{
|
||||
if (this.nestedObjectInfos != null && this.nestedObjectInfos.Count > 0)
|
||||
{
|
||||
this.SubscribeToINotifyPropertyChanged(newItem, newItem, string.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.AddPropertyChangedHandler(newItem);
|
||||
}
|
||||
this.SubscribeToINotifyPropertyChanged(newItem, newItem, string.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.AddPropertyChangedHandler(newItem);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -414,7 +415,7 @@ namespace Telerik.Data.Core
|
|||
this.supportsPropertyChangedInitialized = true;
|
||||
}
|
||||
|
||||
if (this.itemSupportsPropertyChanged && this.shouldSubsribeToPropertyChanged)
|
||||
if (this.itemSupportsPropertyChanged)
|
||||
{
|
||||
this.propertyChangedEventHandler.Subscribe(item);
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace Telerik.Data.Core
|
|||
void Dispose();
|
||||
object GetGroupKey(object item, int level);
|
||||
|
||||
void SubscribeToItemPropertyChanged();
|
||||
void UnsubscribeFromItemPropertyChanged();
|
||||
void SubscribeToNestedItemPropertyChanged();
|
||||
void UnsubscribeFromNestedItemPropertyChanged();
|
||||
}
|
||||
}
|
|
@ -200,7 +200,6 @@ namespace Telerik.UI.Xaml.Controls.Data
|
|||
}
|
||||
|
||||
this.localDataProvider.ItemsSource = this.itemsSource;
|
||||
this.localDataProvider.DataView.SubscribeToItemPropertyChanged();
|
||||
}
|
||||
|
||||
this.UpdateRequestedItems(null, false);
|
||||
|
|
|
@ -28,7 +28,7 @@ namespace Telerik.UI.Xaml.Controls.Grid.Model
|
|||
private FilterDescriptorCollection filterDescriptors;
|
||||
private AggregateDescriptorCollection aggregateDescriptors;
|
||||
private bool isCurrentItemSynchronizing = false;
|
||||
private bool enableLiveUpdates;
|
||||
private bool listenForNestedPropertyChange;
|
||||
|
||||
public object ItemsSource
|
||||
{
|
||||
|
@ -122,16 +122,16 @@ namespace Telerik.UI.Xaml.Controls.Grid.Model
|
|||
}
|
||||
}
|
||||
|
||||
internal bool EnableLiveUpdates
|
||||
internal bool ListenForNestedPropertyChange
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.enableLiveUpdates;
|
||||
return this.listenForNestedPropertyChange;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.enableLiveUpdates = value;
|
||||
this.UpdateDataViewPropertyChangeSubscription(this.enableLiveUpdates);
|
||||
this.listenForNestedPropertyChange = value;
|
||||
this.UpdateDataViewPropertyChangeSubscription(this.listenForNestedPropertyChange);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,7 +140,7 @@ namespace Telerik.UI.Xaml.Controls.Grid.Model
|
|||
this.dataChangeFlags |= descriptor.UpdateFlags;
|
||||
this.GridView.UpdateService.RegisterUpdate((int)UpdateFlags.AffectsData);
|
||||
}
|
||||
|
||||
|
||||
internal IEnumerable ForEachDataDescriptor()
|
||||
{
|
||||
foreach (var descriptor in this.filterDescriptors)
|
||||
|
@ -218,7 +218,7 @@ namespace Telerik.UI.Xaml.Controls.Grid.Model
|
|||
}
|
||||
|
||||
this.localDataProvider.ItemsSource = this.itemsSource;
|
||||
this.UpdateDataViewPropertyChangeSubscription(this.enableLiveUpdates);
|
||||
this.UpdateDataViewPropertyChangeSubscription(this.listenForNestedPropertyChange);
|
||||
}
|
||||
|
||||
this.UpdateRequestedItems(null, false);
|
||||
|
@ -324,7 +324,7 @@ namespace Telerik.UI.Xaml.Controls.Grid.Model
|
|||
this.filterDescriptors.DescriptionCollection = provider.FilterDescriptions;
|
||||
this.aggregateDescriptors.DescriptionCollection = provider.AggregateDescriptions;
|
||||
}
|
||||
|
||||
|
||||
private void CurrencyService_CurrentChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (!this.isCurrentItemSynchronizing)
|
||||
|
@ -468,7 +468,7 @@ namespace Telerik.UI.Xaml.Controls.Grid.Model
|
|||
|
||||
int groupDescriptionCount = this.CurrentDataProvider.Settings.RowGroupDescriptions.Count;
|
||||
bool keepCollapsedState = (this.dataChangeFlags & DataChangeFlags.Group) == DataChangeFlags.None;
|
||||
|
||||
|
||||
if (this.ShouldDisplayIncrementalLoadingIndicator)
|
||||
{
|
||||
this.rowLayout.LayoutStrategies.Add(new PlaceholderStrategy());
|
||||
|
@ -645,11 +645,11 @@ namespace Telerik.UI.Xaml.Controls.Grid.Model
|
|||
{
|
||||
if (shouldSubscribe)
|
||||
{
|
||||
this.localDataProvider.DataView.SubscribeToItemPropertyChanged();
|
||||
this.localDataProvider.DataView.SubscribeToNestedItemPropertyChanged();
|
||||
}
|
||||
else
|
||||
{
|
||||
this.localDataProvider.DataView.UnsubscribeFromItemPropertyChanged();
|
||||
this.localDataProvider.DataView.UnsubscribeFromNestedItemPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ namespace Telerik.UI.Xaml.Controls.Grid.Model
|
|||
{
|
||||
this.executeOperationsSyncroniously = shouldExecuteSyncroniously;
|
||||
this.TrackPropertyChanged = true;
|
||||
this.EnableLiveUpdates = true;
|
||||
|
||||
this.GroupFactory = new DataGroupFactory();
|
||||
|
||||
|
|
|
@ -131,10 +131,10 @@ namespace Telerik.UI.Xaml.Controls.Grid
|
|||
DependencyProperty.Register(nameof(GroupPanelPosition), typeof(GroupPanelPosition), typeof(RadDataGrid), new PropertyMetadata(GroupPanelPosition.Left, OnGroupPanelPositionChanged));
|
||||
|
||||
/// <summary>
|
||||
/// Identifies the <see cref="EnableLiveUpdates"/> dependency property.
|
||||
/// Identifies the <see cref="ListenForNestedPropertyChange"/> dependency property.
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty EnableLiveUpdatesProperty =
|
||||
DependencyProperty.Register(nameof(EnableLiveUpdates), typeof(bool), typeof(RadDataGrid), new PropertyMetadata(true, OnEnableLiveUpdatesPropertyChanged));
|
||||
public static readonly DependencyProperty ListenForNestedPropertyChangeProperty =
|
||||
DependencyProperty.Register(nameof(ListenForNestedPropertyChange), typeof(bool), typeof(RadDataGrid), new PropertyMetadata(false, OnListenForNestedPropertyChangePropertyChanged));
|
||||
|
||||
private DataGridColumnHeaderPanel columnHeadersPanel;
|
||||
private DataGridCellsPanel cellsPanel;
|
||||
|
@ -583,15 +583,15 @@ namespace Telerik.UI.Xaml.Controls.Grid
|
|||
/// <summary>
|
||||
/// Gets or sets a value indicating whether the DataGrid should be updated if INotifyPropertyChanged item from its source is changed.
|
||||
/// </summary>
|
||||
public bool EnableLiveUpdates
|
||||
public bool ListenForNestedPropertyChange
|
||||
{
|
||||
get
|
||||
{
|
||||
return (bool)this.GetValue(EnableLiveUpdatesProperty);
|
||||
return (bool)this.GetValue(ListenForNestedPropertyChangeProperty);
|
||||
}
|
||||
set
|
||||
{
|
||||
this.SetValue(EnableLiveUpdatesProperty, value);
|
||||
this.SetValue(ListenForNestedPropertyChangeProperty, value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1002,10 +1002,10 @@ namespace Telerik.UI.Xaml.Controls.Grid
|
|||
}
|
||||
}
|
||||
|
||||
private static void OnEnableLiveUpdatesPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
private static void OnListenForNestedPropertyChangePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
RadDataGrid grid = d as RadDataGrid;
|
||||
grid.model.EnableLiveUpdates = (bool)e.NewValue;
|
||||
grid.model.ListenForNestedPropertyChange = (bool)e.NewValue;
|
||||
}
|
||||
|
||||
private static void OnColumnResizeModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
|
|
|
@ -85,14 +85,16 @@ namespace SDKExamples.UWP.DataGrid
|
|||
|
||||
private void OnUpdateOnPropertyChangedButtonClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e)
|
||||
{
|
||||
this.grid.EnableLiveUpdates = !this.grid.EnableLiveUpdates;
|
||||
this.grid.ListenForNestedPropertyChange = !this.grid.ListenForNestedPropertyChange;
|
||||
}
|
||||
|
||||
private void OnChangeFirstItemClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e)
|
||||
{
|
||||
Info newInfo = new Info() { Name = new Profile() { Name = "New Info" }, Value = 2000 + newValue++ };
|
||||
this.source[0].Data.Information = newInfo;
|
||||
//Info newInfo = new Info() { Name = new Profile() { Name = "New Info" }, Value = 2000 + newValue++ };
|
||||
//this.source[0].Data.Information = newInfo;
|
||||
newValue++;
|
||||
this.source[0].Data.Information.Value += newValue;
|
||||
//this.source[0].Age += newValue;
|
||||
}
|
||||
|
||||
private void OnAddItemButtonClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e)
|
||||
|
|
Загрузка…
Ссылка в новой задаче