projects/wms-framework/src/lib/baseframework/collectionViews.ts
Provides a binding mechanism that is strongly coupled with the component bound to
PropertyChanged |
Type : SubscriptionEvent<void>
|
Default value : new SubscriptionEvent<(o: any, args: { PropertyName: string }) => void>()
|
Public Source |
Type : any
|
Decorators :
@Dependency(CollectionViewSource.SourceProperty)
|
Gets/sets the data source for this { CollectionViewSource } object. |
Static SourceProperty |
Type : DependencyProperty
|
Default value : new DependencyProperty(
'Source',
null,
CollectionViewSource.sourceChanged
)
|
SourceProperty dependency property |
Public View |
Type : ICollectionView
|
Decorators :
@Dependency(CollectionViewSource.ViewProperty)
|
Gets/sets the { IViewCollection } object used to render this data. |
Static ViewProperty |
Type : DependencyProperty
|
Default value : new DependencyProperty(
'View',
null,
CollectionViewSource.viewChanged
)
|
Provides a source to be strongly bound to a control, acting as a proxy between the component and the given source. ViewProperty dependency property |
Protected bindingExpressions |
Default value : new SimpleDictionary<
string,
BindingExpression
>()
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:65
|
Public BindingValidationError |
Default value : new SubscriptionEvent<
(sender: any, e: BindingValidationErrorEventArgs) => void
>()
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:78
|
Event for validation errors |
Public change |
Type : SubscriptionEvent<void>
|
Default value : new SubscriptionEvent()
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:61
|
Infrastructure event for notifying event changes |
Public Dispatcher |
Type : Dispatcher
|
Default value : Dispatcher.GetDispatcher()
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:55
|
isEnableSetPropertiesRegistry |
Type : boolean
|
Default value : true
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:125
|
Flag which indicates if the dependency property set mechanism is enable |
Public IsInitializingBindings |
Type : boolean
|
Default value : false
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:178
|
Property to determine if bindings are being initialized |
previousValidationMessage |
Type : string
|
Default value : ''
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:70
|
Protected properties |
Type : object
|
Default value : {}
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:64
|
Private setPropertiesRegistry |
Type : Map<string | boolean>
|
Default value : new Map()
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:116
|
Registry with dependencies properties which has been set |
validationerr |
Default value : false
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:69
|
validationMessagesStack |
Type : Array<>
|
Default value : []
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:106
|
Keeps a queue of validation messages registered on the current Dependency Object |
Static sourceChanged | ||||||||||||
sourceChanged(sender: DependencyObject, args: DependencyPropertyChangedEventArgs)
|
||||||||||||
A change handler responsible for handlingchanges of source property
Parameters :
Returns :
void
|
Static viewChanged | ||||||||||||
viewChanged(sender: DependencyObject, args: DependencyPropertyChangedEventArgs)
|
||||||||||||
A change handler responsible for handling changes of view property
Parameters :
Returns :
void
|
Private addRelatedSubscriptionIfRequired | ||||||||||||
addRelatedSubscriptionIfRequired(event: SubscriptionEvent<any>, theHandler: any, bindingExpression: BindingExpression)
|
||||||||||||
Inherited from
DependencyObject
|
||||||||||||
Defined in
DependencyObject:502
|
||||||||||||
Parameters :
Returns :
void
|
Private addSubscriptionForTwoWayBindings | ||||||||||||
addSubscriptionForTwoWayBindings(dependencyProperty: DependencyProperty, binding: Binding, bindingExpression: BindingExpression)
|
||||||||||||
Inherited from
DependencyObject
|
||||||||||||
Defined in
DependencyObject:383
|
||||||||||||
Parameters :
Returns :
void
|
addsValidationMessage | |||||||||
addsValidationMessage(propKey: Binding | string, message: string)
|
|||||||||
Inherited from
DependencyObject
|
|||||||||
Defined in
DependencyObject:135
|
|||||||||
Adds a new validation message associated to a binding or a property name
Parameters :
Returns :
void
|
Private beginSubscribeToMultiPropertyPathChanges | |||||||||||||||
beginSubscribeToMultiPropertyPathChanges(context: any, binding: Binding, dependencyProperty: DependencyProperty, bindingExpression: BindingExpression)
|
|||||||||||||||
Inherited from
DependencyObject
|
|||||||||||||||
Defined in
DependencyObject:542
|
|||||||||||||||
Parameters :
Returns :
void
|
Private checkForSubscriptoinToDataErrorInfo | |||||||||||||||
checkForSubscriptoinToDataErrorInfo(currentContext: any, binding: Binding, propertyToSubscribe: string, bindingExpression: BindingExpression)
|
|||||||||||||||
Inherited from
DependencyObject
|
|||||||||||||||
Defined in
DependencyObject:716
|
|||||||||||||||
Parameters :
Returns :
void
|
Public clearValue | ||||||
clearValue(property: DependencyProperty)
|
||||||
Inherited from
DependencyObject
|
||||||
Defined in
DependencyObject:212
|
||||||
Clears the dependency property value
Parameters :
Returns :
void
|
Equals | ||||||
Equals(obj: any)
|
||||||
Inherited from
DependencyObject
|
||||||
Defined in
DependencyObject:201
|
||||||
Compares this dependency object agains another object.
Parameters :
Returns :
boolean
{boolean} |
GetChild | ||||||
GetChild(idx: number)
|
||||||
Inherited from
DependencyObject
|
||||||
Defined in
DependencyObject:928
|
||||||
Gets the child element at the index position
Parameters :
Returns :
DependencyObject
{DependencyObject} |
GetChildrenCount |
GetChildrenCount()
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:916
|
Method o know the amount of children the parent has
Returns :
number
{number} |
GetHashCode |
GetHashCode()
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:187
|
Gets a hash code for this dependency object.
Returns :
number
{number} |
Public getValue | ||||||
getValue(property: DependencyProperty)
|
||||||
Inherited from
DependencyObject
|
||||||
Defined in
DependencyObject:226
|
||||||
Gets the value of a dependency property
Parameters :
Returns :
any
|
Private handleErrorsOnContext | |||||||||
handleErrorsOnContext(errorCtxt: INotifyDataErrorInfo, args: DataErrorsChangedEventArgs)
|
|||||||||
Inherited from
DependencyObject
|
|||||||||
Defined in
DependencyObject:777
|
|||||||||
Check and register possible errors in an error context
Parameters :
Returns :
void
|
Public IsPropertySet | ||||||
IsPropertySet(propertyName: string)
|
||||||
Inherited from
DependencyObject
|
||||||
Defined in
DependencyObject:376
|
||||||
Indicates if the property has been already set.
Parameters :
Returns :
any
|
Private performDataErrorValidationIfRequired |
performDataErrorValidationIfRequired(binding: Binding, theBindingContext: any)
|
Inherited from
DependencyObject
|
Defined in
DependencyObject:481
|
Performs validation on model if the model implementes IDataErrorINfo
Returns :
void
|
Private performRemoveValidationIfInValidationError | ||||||
performRemoveValidationIfInValidationError(binding: Binding)
|
||||||
Inherited from
DependencyObject
|
||||||
Defined in
DependencyObject:461
|
||||||
Performs the remove validation if the InValidationError is true
Parameters :
Returns :
void
|
Public performTargetObjectBindingUpdate | |||||||||
performTargetObjectBindingUpdate(dependencyProperty: DependencyProperty, binding: Binding)
|
|||||||||
Inherited from
DependencyObject
|
|||||||||
Defined in
DependencyObject:429
|
|||||||||
Updates the target object value associated to the binding.
Parameters :
Returns :
void
|
Private preprocessValue | |||||||||
preprocessValue(property: DependencyProperty, value: any)
|
|||||||||
Inherited from
DependencyObject
|
|||||||||
Defined in
DependencyObject:889
|
|||||||||
Preprocess value to be set to dependency property
Parameters :
Returns :
any
|
Private recreateSubscriptionsForMultiPropertyBindingPath | ||||||||||||||||||||||||
recreateSubscriptionsForMultiPropertyBindingPath(currentContext: any, outerContext: any, properties: string[], propertyIndex: number, dependencyProperty: DependencyProperty, bindingExpression: BindingExpression, subscriptionsForCurrentBindingPath: Array<>)
|
||||||||||||||||||||||||
Inherited from
DependencyObject
|
||||||||||||||||||||||||
Defined in
DependencyObject:682
|
||||||||||||||||||||||||
Parameters :
Returns :
void
|
Private registerSetPropertyIfRequired | ||||||
registerSetPropertyIfRequired(name: string)
|
||||||
Inherited from
DependencyObject
|
||||||
Defined in
DependencyObject:903
|
||||||
Register set property if required
Parameters :
Returns :
void
|
Private removeSubscriptionsForMultiPropertyBindingPath | |||||||||
removeSubscriptionsForMultiPropertyBindingPath(subscriptionsForCurrentBindingPath: [], propertyIndex: number)
|
|||||||||
Inherited from
DependencyObject
|
|||||||||
Defined in
DependencyObject:663
|
|||||||||
Parameters :
Returns :
void
|
removeValidationMessage | ||||||
removeValidationMessage(propKey: Binding | string)
|
||||||
Inherited from
DependencyObject
|
||||||
Defined in
DependencyObject:158
|
||||||
Removes a validation message associated to a binding or a property name
Parameters :
Returns :
void
|
SetBinding | ||||||||||||
SetBinding(dependencyProperty: DependencyProperty, binding: Binding)
|
||||||||||||
Inherited from
DependencyObject
|
||||||||||||
Defined in
DependencyObject:317
|
||||||||||||
Sets a binding to the specified property at runtime
Parameters :
Returns :
void
|
Public setValue | |||||||||
setValue(property: DependencyProperty, value: any)
|
|||||||||
Inherited from
DependencyObject
|
|||||||||
Defined in
DependencyObject:249
|
|||||||||
Sets the value for a dependency property
Parameters :
Returns :
void
|
Public setValueForScopedRegion | ||||||||||||
setValueForScopedRegion(property: DependencyProperty, value: any, scopedRegionManager: IRegionManager)
|
||||||||||||
Inherited from
DependencyObject
|
||||||||||||
Defined in
DependencyObject:282
|
||||||||||||
Sets the value for a dependency property. This is a workaround to support Scoped Region Managers. A research is required to find out the way to get the application region Manager when scoped region managers are used (when creating the DelayedRegionBehavior, the correct scoped region manager must be passed as an argument).
Parameters :
Returns :
void
|
Protected shouldPreventDefaultSourceUpdate | |||||||||
shouldPreventDefaultSourceUpdate(dependencyProperty: DependencyProperty, binding: BindingExpression)
|
|||||||||
Inherited from
DependencyObject
|
|||||||||
Defined in
DependencyObject:870
|
|||||||||
Parameters :
Returns :
boolean
|
Private subscribeToBindingPathChanges | |||||||||||||||
subscribeToBindingPathChanges(context: any, binding: Binding, dependencyProperty: DependencyProperty, bindingExpression: BindingExpression)
|
|||||||||||||||
Inherited from
DependencyObject
|
|||||||||||||||
Defined in
DependencyObject:512
|
|||||||||||||||
Parameters :
Returns :
void
|
Private subscribeToErrorsChangedInModel | ||||||||||||
subscribeToErrorsChangedInModel(errorCtxt: INotifyDataErrorInfo, propertyToSubscribe: string, bindingExpression: BindingExpression)
|
||||||||||||
Inherited from
DependencyObject
|
||||||||||||
Defined in
DependencyObject:748
|
||||||||||||
Parameters :
Returns :
void
|
Private subscribeToPropertyChanges | ||||||||||||||||||||||||
subscribeToPropertyChanges(currentContext: any, outerContext: any, properties: string[], propertyIndex: number, dependencyProperty: DependencyProperty, bindingExpression: BindingExpression, subscriptionsForCurrentBindingPath: Array<>)
|
||||||||||||||||||||||||
Inherited from
DependencyObject
|
||||||||||||||||||||||||
Defined in
DependencyObject:586
|
||||||||||||||||||||||||
Parameters :
Returns :
void
|
Private updateSourceOfBinding | ||||||||||||
updateSourceOfBinding(binding: Binding, outerContext: any, dependencyProperty: DependencyProperty)
|
||||||||||||
Inherited from
DependencyObject
|
||||||||||||
Defined in
DependencyObject:811
|
||||||||||||
Updates the source of a binding
Parameters :
Returns :
void
|
import { Dependency } from '../basecomponentmodel/Dependency';
import { DependencyObject } from '../basecomponentmodel/DependencyObject';
import { DependencyProperty } from '../basecomponentmodel/DependencyProperty';
import { DependencyPropertyChangedEventArgs } from '../basecomponentmodel/DependencyPropertyChangedEventArgs';
import { INotifyPropertyChanged } from '../basecomponentmodel/INotifyPropertyChanged';
import { IItemsSource } from '../models';
import { SubscriptionEvent } from '../utils/SubscriptionEvent';
import {
CollectionChangeAction,
CollectionChangeInfo,
INotifyCollectionChanged,
SimpleList,
SortDescriptionCollection,
} from './collections';
import { SortDescription } from './SortDescription';
/**
*
* Defines a collection of elements to be displayed in a view
* @export
* @interface ICollectionView
* @extends {Iterable<unknown>}
* @extends {INotifyCollectionChanged}
* @wInterface System.ComponentModel.ICollectionView
*/
export interface ICollectionView
extends Iterable<unknown>,
INotifyCollectionChanged {
/**
* Gets the instance of {@link SortDescriptionCollection} object that contains all
* sort criterias
*
* @type {SortDescriptionCollection}
* @memberof ICollectionView
*/
SortDescriptions: SortDescriptionCollection;
}
/**
* Concrete implementation of {@link ICollectionView } object that just delegates all element operations
* on a given {@link Iterable } object.
*/
export class CollectionView implements ICollectionView, IItemsSource {
private sortDescriptions: SortDescriptionCollection =
new SortDescriptionCollection();
private innerHandler: (e: any, args: CollectionChangeInfo) => void;
private sortHandler: (e: any, args: CollectionChangeInfo) => void;
private sortedList: SimpleList<any>;
// inherited
get SortDescriptions(): SortDescriptionCollection {
return this.sortDescriptions;
}
/**
* Creates an instance of CollectionView.
* @param {Iterable<unknown>} elements
* @memberof CollectionView
*/
constructor(private elements: Iterable<unknown>) {
let notifiable: INotifyCollectionChanged =
elements as any as INotifyCollectionChanged;
if (notifiable?.CollectionChanged) {
this.sortedList = new SimpleList((elements as any).internalArray);
this.innerHandler = notifiable.CollectionChanged.addHandler(
(sender, args) => this.handleInnerChanges(sender, args)
);
} else {
this.sortedList = new SimpleList(elements);
}
this.sortHandler = this.sortDescriptions.CollectionChanged.addHandler(
(sender, args) => this.handleSortDescriptionChanges()
);
}
// inherited
get internalArray() {
return this.sortedList?.internalArray;
}
/**
* Releases all resources associated to this Collection view object
*
* @memberof CollectionView
*/
release() {
if (this.innerHandler) {
let notifiable: INotifyCollectionChanged = this
.elements as any as INotifyCollectionChanged;
if (notifiable) {
notifiable.CollectionChanged.removeHandler(this.innerHandler);
}
}
this.sortDescriptions.CollectionChanged.removeHandler(this.sortHandler);
}
/**
* Handles changes in the Sorted Description object by resorting all elements in the list
* with the new sorting descriptors
* @param sender
* @param args
*/
private handleSortDescriptionChanges(): void {
this.sort();
let args: CollectionChangeInfo = new CollectionChangeInfo(
CollectionChangeAction.Reset
);
this.CollectionChanged.fire([this, args]);
}
/**
* Sorts the underlying list with current SortDescription object
*
* @private
* @memberof CollectionView
*/
private sort() {
this.sortedList.sort((x: any, y: any) =>
SortDescription.sortFunction(this.sortDescriptions, x, y)
);
}
/**
* Handles the underlying INotifyCollectionChanged changes by recreating the list and sorting it
* with the new changes
*
* @private
* @param {*} sender
* @param {CollectionChangeInfo} args
* @memberof CollectionView
*/
private handleInnerChanges(sender: any, args: CollectionChangeInfo) {
this.sortedList = new SimpleList((this.elements as any).internalArray);
this.sort();
this.CollectionChanged.fire([sender, args]);
}
// inherited
*[Symbol.iterator](): Iterator<unknown, any, undefined> {
for (const e of this.sortedList) {
yield e;
}
}
// inherited
CollectionChanged: SubscriptionEvent<
(e: any, args: CollectionChangeInfo) => void
> = new SubscriptionEvent();
}
/**
* Provides a binding mechanism that is strongly coupled with the component bound to
*
* @export
* @class CollectionViewSource
* @extends {DependencyObject}
* @wType System.Windows.Data.CollectionViewSource
*/
export class CollectionViewSource
extends DependencyObject
implements INotifyPropertyChanged
{
PropertyChanged: SubscriptionEvent<
(o: any, args: { PropertyName: string }) => void
> = new SubscriptionEvent<(o: any, args: { PropertyName: string }) => void>();
/**
* SourceProperty dependency property
*
* @static
* @type {DependencyProperty}
* @memberof CollectionViewSource
*/
static SourceProperty: DependencyProperty = new DependencyProperty(
'Source',
null,
CollectionViewSource.sourceChanged
);
/**
* Provides a source to be strongly bound to a control, acting as a proxy between the component
* and the given source.
* ViewProperty dependency property
*
* @static
* @type {DependencyProperty}
* @memberof CollectionViewSource
*/
static ViewProperty: DependencyProperty = new DependencyProperty(
'View',
null,
CollectionViewSource.viewChanged
);
/**
* Gets/sets the data source for this { CollectionViewSource } object.
*
* @type {*}
* @memberof ListBox
*/
@Dependency(CollectionViewSource.SourceProperty)
public Source: any;
/**
* Gets/sets the { IViewCollection } object used to render this data.
*
* @type {*}
* @memberof ListBox
*/
@Dependency(CollectionViewSource.ViewProperty)
public View: ICollectionView;
/**
* A change handler responsible for handlingchanges of source property
* @param sender the sender object
* @param args a {@link DependencyPropertyChangedEventArgs } object that has the changed values
*/
public static sourceChanged(
sender: DependencyObject,
args: DependencyPropertyChangedEventArgs
): void {
let collection: CollectionViewSource = sender as CollectionViewSource;
if (collection) {
let newSource: Iterable<unknown> = args.NewValue as Iterable<unknown>;
collection.View = newSource ? new CollectionView(newSource) : null;
}
}
/**
* A change handler responsible for handling changes of view property
* @param sender the sender object
* @param args a {@link DependencyPropertyChangedEventArgs } object that has the changed values
*/
public static viewChanged(
sender: DependencyObject,
args: DependencyPropertyChangedEventArgs
): void {
let collection: CollectionViewSource = sender as CollectionViewSource;
if (collection) {
let oldView: CollectionView = args.OldValue as CollectionView;
oldView?.release();
collection.PropertyChanged.fire([collection, { PropertyName: 'View' }]);
}
}
}