forked from PowerShell/PowerShell
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReadOnlyObservableAsyncCollection.cs
More file actions
133 lines (119 loc) · 4.37 KB
/
Copy pathReadOnlyObservableAsyncCollection.cs
File metadata and controls
133 lines (119 loc) · 4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
namespace Microsoft.Management.UI.Internal
{
/// <summary>
/// Represents a read-only ObservableCollection which also implement IAsyncProgress.
/// </summary>
/// <typeparam name="T">The type held by the collection.</typeparam>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.MSInternal", "CA903:InternalNamespaceShouldNotContainPublicTypes")]
public class ReadOnlyObservableAsyncCollection<T> :
ReadOnlyCollection<T>,
IAsyncProgress,
INotifyPropertyChanged, INotifyCollectionChanged
{
#region Private fields
private IAsyncProgress asyncProgress;
#endregion Private fields
#region Constructors
/// <summary>
/// The constructor.
/// </summary>
/// <param name="list">The collection with which to create this instance of the ReadOnlyObservableAsyncCollection class.
/// The object must also implement IAsyncProgress, INotifyCollectionChanged and INotifyPropertyChanged.</param>
public ReadOnlyObservableAsyncCollection(IList<T> list)
: base(list)
{
this.asyncProgress = list as IAsyncProgress;
((INotifyCollectionChanged)this.Items).CollectionChanged += new NotifyCollectionChangedEventHandler(this.HandleCollectionChanged);
((INotifyPropertyChanged)this.Items).PropertyChanged += new PropertyChangedEventHandler(this.HandlePropertyChanged);
}
#endregion Constructors
#region Events
/// <summary>
/// Occurs when the collection changes, either by adding or removing an item.
/// </summary>
/// <remarks>
/// see <seealso cref="INotifyCollectionChanged"/>
/// </remarks>
public event NotifyCollectionChangedEventHandler CollectionChanged;
/// <summary>
/// Occurs when a property changes.
/// </summary>
/// <remarks>
/// see <seealso cref="INotifyPropertyChanged"/>
/// </remarks>
public event PropertyChangedEventHandler PropertyChanged;
#endregion Events
#region IAsyncProgress
/// <summary>
/// Gets a value indicating whether the async operation is currently running.
/// </summary>
public bool OperationInProgress
{
get
{
if (this.asyncProgress == null)
{
return false;
}
else
{
return this.asyncProgress.OperationInProgress;
}
}
}
/// <summary>
/// Gets the error for the async operation. This field is only valid if
/// OperationInProgress is false. null indicates there was no error.
/// </summary>
public Exception OperationError
{
get
{
if (this.asyncProgress == null)
{
return null;
}
else
{
return this.asyncProgress.OperationError;
}
}
}
#endregion IAsyncProgress
#region Private Methods
private void OnCollectionChanged(NotifyCollectionChangedEventArgs args)
{
NotifyCollectionChangedEventHandler eh = this.CollectionChanged;
if (eh != null)
{
eh(this, args);
}
}
private void OnPropertyChanged(PropertyChangedEventArgs args)
{
PropertyChangedEventHandler eh = this.PropertyChanged;
if (eh != null)
{
eh(this, args);
}
}
// forward CollectionChanged events from the base list to our listeners
private void HandleCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
this.OnCollectionChanged(e);
}
// forward PropertyChanged events from the base list to our listeners
private void HandlePropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.OnPropertyChanged(e);
}
#endregion Private Methods
}
}