SimpleWindow
载入中...
搜索中...
未找到
DataBinding.h
1#pragma once
2
3#include "UIElement.h"
4
5namespace sw
6{
11 {
12 private:
16 UIElement *_targetElement;
17
21 std::unique_ptr<Binding> _innerBinding;
22
23 private:
30 : _targetElement(targetElement), _innerBinding(binding)
31 {
32 UpdateDataContextBinding();
33 RegisterNotifications();
34 }
35
36 public:
40 virtual ~DataBinding()
41 {
42 UnregisterNotifications();
43 }
44
49 virtual bool UpdateTarget() override
50 {
51 return _innerBinding->UpdateTarget();
52 }
53
58 virtual bool UpdateSource() override
59 {
60 return _innerBinding->UpdateSource();
61 }
62
66 virtual FieldId GetTargetPropertyId() const override
67 {
68 return _innerBinding->GetTargetPropertyId();
69 }
70
74 virtual FieldId GetSourcePropertyId() const override
75 {
76 return _innerBinding->GetSourcePropertyId();
77 }
78
84 {
85 return _targetElement;
86 }
87
93 {
94 if (_targetElement != element) {
95 UnregisterNotifications();
96 _targetElement = element;
97 UpdateDataContextBinding();
98 RegisterNotifications();
99 }
100 }
101
102 private:
106 void RegisterNotifications()
107 {
108 if (_targetElement == nullptr) {
109 return;
110 }
111
112 _targetElement->ObjectDead +=
113 ObjectDeadEventHandler(*this, &DataBinding::OnTargetElementDead);
114
115 _targetElement->DataContextChanged +=
116 DataContextChangedEventHandler(*this, &DataBinding::OnTargetElementDataContextChanged);
117 }
118
122 void UnregisterNotifications()
123 {
124 if (_targetElement == nullptr) {
125 return;
126 }
127
128 _targetElement->ObjectDead -=
129 ObjectDeadEventHandler(*this, &DataBinding::OnTargetElementDead);
130
131 _targetElement->DataContextChanged -=
132 DataContextChangedEventHandler(*this, &DataBinding::OnTargetElementDataContextChanged);
133 }
134
138 void UpdateDataContextBinding()
139 {
140 if (_targetElement == nullptr) {
141 _innerBinding->SetBindingObjects(nullptr, nullptr);
142 } else {
143 _innerBinding->SetBindingObjects(_targetElement, _targetElement->CurrentDataContext);
144 }
145 }
146
150 void OnTargetElementDead(INotifyObjectDead &sender)
151 {
152 SetTargetElement(nullptr);
153 }
154
158 void OnTargetElementDataContextChanged(UIElement &sender, DynamicObject *oldval)
159 {
160 UpdateDataContextBinding();
161 }
162
163 public:
172 {
173 assert(binding != nullptr);
174 return new DataBinding(targetElement, binding);
175 }
176
186 template <
187 typename TTargetObject,
188 typename TTargetProperty,
189 typename TSourceObject,
190 typename TSourceProperty>
193 BindingMode mode,
195 -> typename std::enable_if<
198 std::is_base_of<DynamicObject, TTargetObject>::value &&
199 std::is_base_of<DynamicObject, TSourceObject>::value &&
200 std::is_same<typename TTargetProperty::TValue, typename TSourceProperty::TValue>::value,
201 DataBinding *>::type
202 {
203 return new DataBinding(nullptr, Binding::Create(targetProperty, sourceProperty, mode, converter));
204 }
205
215 template <
216 typename TTargetObject,
217 typename TTargetProperty,
218 typename TSourceObject,
219 typename TSourceProperty>
222 BindingMode mode,
224 -> typename std::enable_if<
227 std::is_base_of<DynamicObject, TTargetObject>::value &&
228 std::is_base_of<DynamicObject, TSourceObject>::value &&
229 !std::is_same<typename TTargetProperty::TValue, typename TSourceProperty::TValue>::value,
230 DataBinding *>::type
231 {
232 return new DataBinding(nullptr, Binding::Create(targetProperty, sourceProperty, mode, converter));
233 }
234 };
235}
数据绑定基类
Definition Binding.h:38
数据绑定类
Definition Binding.h:73
数据绑定,用于UI元素与DataContext之间的属性绑定
Definition DataBinding.h:11
virtual FieldId GetTargetPropertyId() const override
获取目标属性ID
Definition DataBinding.h:66
virtual bool UpdateSource() override
更新源属性的值
Definition DataBinding.h:58
virtual ~DataBinding()
析构函数
Definition DataBinding.h:40
static DataBinding * Create(UIElement *targetElement, Binding *binding)
创建数据绑定对象
Definition DataBinding.h:171
UIElement * GetTargetElement() const
获取目标元素
Definition DataBinding.h:83
static auto Create(TTargetProperty TTargetObject::*targetProperty, TSourceProperty TSourceObject::*sourceProperty, BindingMode mode, IValueConverter< typename TSourceProperty::TValue, typename TTargetProperty::TValue > *converter=nullptr) -> typename std::enable_if< _IsProperty< TTargetProperty >::value &&_IsProperty< TSourceProperty >::value &&std::is_base_of< DynamicObject, TTargetObject >::value &&std::is_base_of< DynamicObject, TSourceObject >::value &&std::is_same< typename TTargetProperty::TValue, typename TSourceProperty::TValue >::value, DataBinding * >::type
创建数据绑定对象
Definition DataBinding.h:191
virtual FieldId GetSourcePropertyId() const override
获取源属性ID
Definition DataBinding.h:74
void SetTargetElement(UIElement *element)
设置目标元素
Definition DataBinding.h:92
static auto Create(TTargetProperty TTargetObject::*targetProperty, TSourceProperty TSourceObject::*sourceProperty, BindingMode mode, IValueConverter< typename TSourceProperty::TValue, typename TTargetProperty::TValue > *converter) -> typename std::enable_if< _IsProperty< TTargetProperty >::value &&_IsProperty< TSourceProperty >::value &&std::is_base_of< DynamicObject, TTargetObject >::value &&std::is_base_of< DynamicObject, TSourceObject >::value &&!std::is_same< typename TTargetProperty::TValue, typename TSourceProperty::TValue >::value, DataBinding * >::type
创建数据绑定对象
Definition DataBinding.h:220
virtual bool UpdateTarget() override
更新目标属性的值
Definition DataBinding.h:49
动态对象基类
Definition Reflection.h:27
ObjectDeadEventHandler ObjectDead
对象销毁时触发该事件
Definition INotifyObjectDead.h:23
值转换器接口
Definition IValueConverter.h:14
表示界面中的元素
Definition UIElement.h:92
const ReadOnlyProperty< DynamicObject * > CurrentDataContext
当前元素的有效数据上下文
Definition UIElement.h:420
DataContextChangedEventHandler DataContextChanged
数据上下问改变时触发该事件
Definition UIElement.h:286
表示字段的唯一标识符
Definition Reflection.h:898
判断类型是否为属性的辅助模板
Definition Property.h:95