Skip to content

Commit 9910e83

Browse files
committed
Bring back the way simpler way to observe DPs in WPF
1 parent bf4e582 commit 9910e83

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

ReactiveUI.Platforms/ReactiveUI.Xaml_Net45.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,13 @@
135135
<Link>Xaml\Properties\CommonAssemblyInfo.cs</Link>
136136
</Compile>
137137
<Compile Include="ComponentModelTypeConverter.cs" />
138+
<Compile Include="Xaml\WpfDependencyObjectObservableForProperty.cs" />
138139
<Compile Include="Xaml\ActivationForViewFetcher.cs" />
139140
<Compile Include="Xaml\PlatformOperations.cs" />
140141
<Compile Include="Registrations.cs" />
141142
<Compile Include="Xaml\AutoDataTemplateBindingHook.cs" />
142143
<Compile Include="Xaml\BindingTypeConverters.cs" />
143144
<Compile Include="Xaml\CreatesCommandBinding.cs" />
144-
<Compile Include="Xaml\DependencyObjectObservableForProperty.cs" />
145145
<Compile Include="Xaml\Properties\AssemblyInfo.cs" />
146146
<Compile Include="Xaml\RoutedViewHost.cs" />
147147
<Compile Include="Xaml\TransitioningContentControl.cs" />
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using System.Windows;
7+
using System.Reflection;
8+
using System.ComponentModel;
9+
using System.Reactive.Linq;
10+
using System.Reactive.Disposables;
11+
12+
namespace ReactiveUI.Xaml
13+
{
14+
public class DependencyObjectObservableForProperty : ICreatesObservableForProperty
15+
{
16+
public int GetAffinityForObject(Type type, string propertyName, bool beforeChanged = false)
17+
{
18+
if (!typeof(DependencyObject).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) return 0;
19+
return getDependencyProperty(type, propertyName) != null ? 4 : 0;
20+
}
21+
22+
public IObservable<IObservedChange<object, object>> GetNotificationForProperty(object sender, string propertyName, bool beforeChanged = false)
23+
{
24+
var type = sender.GetType();
25+
var dpd = DependencyPropertyDescriptor.FromProperty(getDependencyProperty(type, propertyName), sender.GetType());
26+
27+
return Observable.Create<IObservedChange<object, object>>(subj => {
28+
var handler = new EventHandler((o, e) => {
29+
subj.OnNext(new ObservedChange<object, object>() {
30+
Sender = sender,
31+
PropertyName = propertyName,
32+
Value = null,
33+
});
34+
});
35+
36+
dpd.AddValueChanged(sender, handler);
37+
return Disposable.Create(() => dpd.RemoveValueChanged(sender, handler));
38+
});
39+
}
40+
41+
DependencyProperty getDependencyProperty(Type type, string propertyName)
42+
{
43+
var fi = type.GetRuntimeFields().FirstOrDefault(x => x.Name == propertyName + "Property" && x.IsStatic);
44+
if (fi != null) {
45+
return (DependencyProperty)fi.GetValue(null);
46+
}
47+
48+
return null;
49+
}
50+
}
51+
}

0 commit comments

Comments
 (0)