Skip to content

Commit 4a45247

Browse files
qian-oArlodotexe
authored andcommitted
Simplify the listening of dependency properties.
1 parent 4b4e246 commit 4a45247

2 files changed

Lines changed: 21 additions & 69 deletions

File tree

components/LayoutTransformControl/src/LayoutTransformControl.Properties.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ private void UnsubscribeFromTransformPropertyChanges(Transform transform)
127127
foreach (var propertyChangeEventSource in propertyChangeEventSources)
128128
{
129129
propertyChangeEventSource.ValueChanged -= OnTransformPropertyChanged;
130+
propertyChangeEventSource.Unregister();
130131
}
131132

132133
_transformPropertyChangeEventSources.Remove(transform);
@@ -153,7 +154,7 @@ private void SubscribeToTransformPropertyChanges(Transform transform)
153154

154155
if (rotateTransform != null)
155156
{
156-
var anglePropertyChangeEventSource = new PropertyChangeEventSource<double>(rotateTransform, "Angle");
157+
var anglePropertyChangeEventSource = new PropertyChangeEventSource<double>(rotateTransform, RotateTransform.AngleProperty);
157158
anglePropertyChangeEventSource.ValueChanged += OnTransformPropertyChanged;
158159
propertyChangeEventSources.Add(anglePropertyChangeEventSource);
159160
return;
@@ -163,11 +164,11 @@ private void SubscribeToTransformPropertyChanges(Transform transform)
163164

164165
if (scaleTransform != null)
165166
{
166-
var scaleXPropertyChangeEventSource = new PropertyChangeEventSource<double>(scaleTransform, "ScaleX");
167+
var scaleXPropertyChangeEventSource = new PropertyChangeEventSource<double>(scaleTransform, ScaleTransform.ScaleXProperty);
167168
scaleXPropertyChangeEventSource.ValueChanged += OnTransformPropertyChanged;
168169
propertyChangeEventSources.Add(scaleXPropertyChangeEventSource);
169170

170-
var scaleYPropertyChangeEventSource = new PropertyChangeEventSource<double>(scaleTransform, "ScaleY");
171+
var scaleYPropertyChangeEventSource = new PropertyChangeEventSource<double>(scaleTransform, ScaleTransform.ScaleYProperty);
171172
scaleYPropertyChangeEventSource.ValueChanged += OnTransformPropertyChanged;
172173
propertyChangeEventSources.Add(scaleYPropertyChangeEventSource);
173174
return;
@@ -177,11 +178,11 @@ private void SubscribeToTransformPropertyChanges(Transform transform)
177178

178179
if (skewTransform != null)
179180
{
180-
var angleXPropertyChangeEventSource = new PropertyChangeEventSource<double>(skewTransform, "AngleX");
181+
var angleXPropertyChangeEventSource = new PropertyChangeEventSource<double>(skewTransform, SkewTransform.AngleXProperty);
181182
angleXPropertyChangeEventSource.ValueChanged += OnTransformPropertyChanged;
182183
propertyChangeEventSources.Add(angleXPropertyChangeEventSource);
183184

184-
var angleYPropertyChangeEventSource = new PropertyChangeEventSource<double>(skewTransform, "AngleY");
185+
var angleYPropertyChangeEventSource = new PropertyChangeEventSource<double>(skewTransform, SkewTransform.AngleYProperty);
185186
angleYPropertyChangeEventSource.ValueChanged += OnTransformPropertyChanged;
186187
propertyChangeEventSources.Add(angleYPropertyChangeEventSource);
187188
return;
@@ -194,7 +195,7 @@ private void SubscribeToTransformPropertyChanges(Transform transform)
194195
var matrixPropertyChangeEventSource =
195196
new PropertyChangeEventSource<double>(
196197
matrixTransform,
197-
"Matrix");
198+
MatrixTransform.MatrixProperty);
198199
matrixPropertyChangeEventSource.ValueChanged += OnTransformPropertyChanged;
199200
propertyChangeEventSources.Add(matrixPropertyChangeEventSource);
200201
}

components/LayoutTransformControl/src/PropertyChangeEventSource.cs

Lines changed: 14 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -8,87 +8,38 @@ namespace CommunityToolkit.WinUI.Controls;
88
/// Allows raise an event when the value of a dependency property changes when a view model is otherwise not necessary.
99
/// </summary>
1010
/// <typeparam name="TPropertyType">Type of the DependencyProperty</typeparam>
11-
internal partial class PropertyChangeEventSource<TPropertyType> : FrameworkElement
11+
internal partial class PropertyChangeEventSource<TPropertyType>
1212
{
1313
private readonly DependencyObject _source;
14+
private readonly DependencyProperty _property;
15+
private readonly long _token;
1416

1517
/// <summary>
1618
/// Occurs when the value changes.
1719
/// </summary>
1820
public event EventHandler<TPropertyType> ValueChanged;
1921

20-
/// <summary>
21-
/// Value Dependency Property
22-
/// </summary>
23-
public static readonly DependencyProperty ValueProperty =
24-
DependencyProperty.Register(
25-
"Value",
26-
typeof(TPropertyType),
27-
typeof(PropertyChangeEventSource<TPropertyType>),
28-
new PropertyMetadata(default(TPropertyType), OnValueChanged));
29-
30-
/// <summary>
31-
/// Gets or sets the Value property. This dependency property
32-
/// indicates the value.
33-
/// </summary>
34-
public TPropertyType Value
35-
{
36-
get { return (TPropertyType)GetValue(ValueProperty); }
37-
set { SetValue(ValueProperty, value); }
38-
}
39-
40-
/// <summary>
41-
/// Handles changes to the Value property.
42-
/// </summary>
43-
/// <param name="d">
44-
/// The <see cref="DependencyObject"/> on which the property has changed value.
45-
/// </param>
46-
/// <param name="e">
47-
/// Event data that is issued by any event that
48-
/// tracks changes to the effective value of this property.
49-
/// </param>
50-
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
51-
{
52-
var target = (PropertyChangeEventSource<TPropertyType>)d;
53-
TPropertyType oldValue = (TPropertyType)e.OldValue;
54-
TPropertyType newValue = target.Value;
55-
target.OnValueChanged(oldValue, newValue);
56-
}
57-
58-
/// <summary>
59-
/// Provides derived classes an opportunity to handle changes to the Value property.
60-
/// </summary>
61-
/// <param name="oldValue">The old Value value</param>
62-
/// <param name="newValue">The new Value value</param>
63-
private void OnValueChanged(TPropertyType oldValue, TPropertyType newValue)
64-
{
65-
ValueChanged?.Invoke(_source, newValue);
66-
}
67-
6822
/// <summary>
6923
/// Initializes a new instance of the <see cref="PropertyChangeEventSource{TPropertyType}"/> class.
7024
/// </summary>
7125
/// <param name="source">The source.</param>
72-
/// <param name="propertyName">Name of the property.</param>
73-
/// <param name="bindingMode">The binding mode.</param>
26+
/// <param name="property">Monitor this dependency property for changes.</param>
7427
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
7528
public PropertyChangeEventSource(
7629
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
7730
DependencyObject source,
78-
string propertyName,
79-
BindingMode bindingMode = BindingMode.TwoWay)
31+
DependencyProperty property)
8032
{
8133
_source = source;
34+
_property = property;
35+
_token = source.RegisterPropertyChangedCallback(property, (_, _) =>
36+
{
37+
ValueChanged?.Invoke(this, (TPropertyType)source.GetValue(property));
38+
});
39+
}
8240

83-
// Bind to the property to be able to get its changes relayed as events through the ValueChanged event.
84-
var binding =
85-
new Binding
86-
{
87-
Source = source,
88-
Path = new PropertyPath(propertyName),
89-
Mode = bindingMode
90-
};
91-
92-
SetBinding(ValueProperty, binding);
41+
public void Unregister()
42+
{
43+
_source.UnregisterPropertyChangedCallback(_property, _token);
9344
}
9445
}

0 commit comments

Comments
 (0)