SimpleWindow
载入中...
搜索中...
未找到
DataBinding.h
1#pragma once
2
3#include "UIElement.h"
4
5namespace sw
6{
10 class DataBinding final : public BindingBase
11 {
12 private:
16 UIElement *_targetElement;
17
21 std::unique_ptr<Binding> _innerBinding;
22
23 private:
29 DataBinding(UIElement *targetElement, Binding *binding)
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 _targetElement->ObjectDead +=
110 ObjectDeadEventHandler(*this, &DataBinding::OnTargetElementDead);
111 _targetElement->DataContextChanged +=
112 DataContextChangedEventHandler(*this, &DataBinding::OnTargetElementDataContextChanged);
113 }
114 }
115
119 void UnregisterNotifications()
120 {
121 if (_targetElement != nullptr) {
122 _targetElement->ObjectDead -=
123 ObjectDeadEventHandler(*this, &DataBinding::OnTargetElementDead);
124 _targetElement->DataContextChanged -=
125 DataContextChangedEventHandler(*this, &DataBinding::OnTargetElementDataContextChanged);
126 }
127 }
128
132 void UpdateDataContextBinding()
133 {
134 if (_targetElement == nullptr) {
135 _innerBinding->SetBindingObjects(nullptr, nullptr);
136 } else {
137 _innerBinding->SetBindingObjects(_targetElement, _targetElement->CurrentDataContext);
138 }
139 }
140
144 void OnTargetElementDead(INotifyObjectDead &sender)
145 {
146 SetTargetElement(nullptr);
147 }
148
152 void OnTargetElementDataContextChanged(UIElement &sender, DynamicObject *oldval)
153 {
154 UpdateDataContextBinding();
155 }
156
157 public:
165 static DataBinding *Create(UIElement *targetElement, Binding *binding)
166 {
167 assert(binding != nullptr);
168 return new DataBinding(targetElement, binding);
169 }
170
180 template <
181 typename TTargetObject,
182 typename TTargetProperty,
183 typename TSourceObject,
184 typename TSourceProperty>
185 static auto Create(TTargetProperty TTargetObject::*targetProperty,
186 TSourceProperty TSourceObject::*sourceProperty,
187 BindingMode mode,
188 IValueConverter<typename TSourceProperty::TValue, typename TTargetProperty::TValue> *converter = nullptr)
189 -> typename std::enable_if<
190 _IsProperty<TTargetProperty>::value &&
191 _IsProperty<TSourceProperty>::value &&
192 std::is_base_of<DynamicObject, TTargetObject>::value &&
193 std::is_base_of<DynamicObject, TSourceObject>::value &&
194 std::is_same<typename TTargetProperty::TValue, typename TSourceProperty::TValue>::value,
195 DataBinding *>::type
196 {
197 return new DataBinding(nullptr, Binding::Create(targetProperty, sourceProperty, mode, converter));
198 }
199
209 template <
210 typename TTargetObject,
211 typename TTargetProperty,
212 typename TSourceObject,
213 typename TSourceProperty>
214 static auto Create(TTargetProperty TTargetObject::*targetProperty,
215 TSourceProperty TSourceObject::*sourceProperty,
216 BindingMode mode,
217 IValueConverter<typename TSourceProperty::TValue, typename TTargetProperty::TValue> *converter)
218 -> typename std::enable_if<
219 _IsProperty<TTargetProperty>::value &&
220 _IsProperty<TSourceProperty>::value &&
221 std::is_base_of<DynamicObject, TTargetObject>::value &&
222 std::is_base_of<DynamicObject, TSourceObject>::value &&
223 !std::is_same<typename TTargetProperty::TValue, typename TSourceProperty::TValue>::value,
224 DataBinding *>::type
225 {
226 return new DataBinding(nullptr, Binding::Create(targetProperty, sourceProperty, mode, converter));
227 }
228 };
229}
数据绑定基类
Definition Binding.h:38
数据绑定类
Definition Binding.h:73
static auto Create(DynamicObject *target, TTargetProperty TTargetObject::*targetProperty, DynamicObject *source, 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, Binding * >::type
创建绑定对象
Definition Binding.h:408
数据绑定,用于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:165
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:185
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:214
virtual bool UpdateTarget() override
更新目标属性的值
Definition DataBinding.h:49
Definition Delegate.h:21
动态对象基类
Definition Reflection.h:26
ObjectDeadEventHandler ObjectDead
对象销毁时触发该事件
Definition INotifyObjectDead.h:23
值转换器接口
Definition IValueConverter.h:20
表示界面中的元素
Definition UIElement.h:90
const ReadOnlyProperty< DynamicObject * > CurrentDataContext
当前元素的有效数据上下文
Definition UIElement.h:418
DataContextChangedEventHandler DataContextChanged
数据上下问改变时触发该事件
Definition UIElement.h:284
表示字段的唯一标识符
Definition Reflection.h:177
判断类型是否为属性的辅助模板
Definition Property.h:94