3#include "INotifyObjectDead.h"
4#include "INotifyPropertyChanged.h"
5#include "IValueConverter.h"
12 enum class BindingMode {
108 void (*_converterDeleter)(
void *);
113 Func<Binding *, bool> _updateTargetFunc;
118 Func<Binding *, bool> _updateSourceFunc;
137 UnregisterNotifications();
139 if (_converterDeleter && _converter) {
140 _converterDeleter(_converter);
152 if (_updateTargetFunc) {
153 result = _updateTargetFunc(
this);
166 if (_updateSourceFunc) {
167 result = _updateSourceFunc(
this);
177 return _targetPropertyId;
185 return _sourcePropertyId;
201 return _targetObject;
209 return _sourceObject;
228 if (_targetObject != target) {
229 UnregisterNotifications();
230 _targetObject = target;
231 RegisterNotifications();
241 if (_sourceObject != source) {
242 UnregisterNotifications();
243 _sourceObject = source;
244 RegisterNotifications();
254 if (_targetObject != target ||
255 _sourceObject != source)
257 UnregisterNotifications();
258 _targetObject = target;
259 _sourceObject = source;
260 RegisterNotifications();
269 void RegisterNotifications()
274 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObj)) {
278 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObj)) {
280 PropertyChangedEventHandler(*
this, &Binding::OnSourcePropertyChanged);
283 INotifyObjectDead *targetNotifObjDead =
nullptr;
284 INotifyObjectDead *sourceNotifObjDead =
nullptr;
286 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObjDead)) {
287 targetNotifObjDead->ObjectDead +=
288 ObjectDeadEventHandler(*
this, &Binding::OnTargetObjectDead);
290 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObjDead)) {
291 sourceNotifObjDead->ObjectDead +=
292 ObjectDeadEventHandler(*
this, &Binding::OnSourceObjectDead);
299 void UnregisterNotifications()
301 INotifyPropertyChanged *targetNotifObj =
nullptr;
302 INotifyPropertyChanged *sourceNotifObj =
nullptr;
304 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObj)) {
306 PropertyChangedEventHandler(*
this, &Binding::OnTargetPropertyChanged);
308 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObj)) {
309 sourceNotifObj->PropertyChanged -=
310 PropertyChangedEventHandler(*
this, &Binding::OnSourcePropertyChanged);
313 INotifyObjectDead *targetNotifObjDead =
nullptr;
314 INotifyObjectDead *sourceNotifObjDead =
nullptr;
316 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObjDead)) {
317 targetNotifObjDead->ObjectDead -=
318 ObjectDeadEventHandler(*
this, &Binding::OnTargetObjectDead);
320 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObjDead)) {
321 sourceNotifObjDead->ObjectDead -=
322 ObjectDeadEventHandler(*
this, &Binding::OnSourceObjectDead);
329 void OnTargetPropertyChanged(INotifyPropertyChanged &sender, FieldId propertyId)
331 if (propertyId != _targetPropertyId) {
335 if (_mode == BindingMode::TwoWay ||
336 _mode == BindingMode::OneWayToSource) {
344 void OnSourcePropertyChanged(INotifyPropertyChanged &sender, FieldId propertyId)
346 if (propertyId != _sourcePropertyId) {
350 if (_mode == BindingMode::TwoWay ||
351 _mode == BindingMode::OneWay) {
359 void OnTargetObjectDead(INotifyObjectDead &sender)
367 void OnSourceObjectDead(INotifyObjectDead &sender)
375 void OnBindingChanged()
378 case BindingMode::OneTime:
379 case BindingMode::OneWay:
380 case BindingMode::TwoWay: {
384 case BindingMode::OneWayToSource: {
401 template <
typename TTargetValue,
typename TSourceValue>
402 static Binding *Create(DynamicObject *target, FieldId targetPropertyId,
403 DynamicObject *source, FieldId sourcePropertyId,
404 BindingMode mode, IValueConverter<TSourceValue, TTargetValue> *converter)
406 auto binding =
new Binding;
408 binding->_targetObject = target;
409 binding->_sourceObject = source;
410 binding->_targetPropertyId = targetPropertyId;
411 binding->_sourcePropertyId = sourcePropertyId;
413 binding->_mode = mode;
414 binding->_converter = converter;
416 binding->_converterDeleter = [](
void *ptr) {
417 delete reinterpret_cast<IValueConverter<TSourceValue, TTargetValue> *
>(ptr);
435 typename TTargetObject,
436 typename TTargetProperty,
437 typename TSourceObject,
438 typename TSourceProperty>
467 binding->_targetObject ==
nullptr ||
468 binding->_sourceObject ==
nullptr) {
493 binding->_targetObject ==
nullptr ||
494 binding->_sourceObject ==
nullptr) {
510 binding->RegisterNotifications();
620 binding->_targetObject ==
nullptr ||
621 binding->_sourceObject ==
nullptr) {
641 binding->_targetObject ==
nullptr ||
642 binding->_sourceObject ==
nullptr) {
652 binding->RegisterNotifications();
数据绑定基类
Definition Binding.h:38
virtual FieldId GetTargetPropertyId() const =0
获取目标属性ID
virtual ~BindingBase()=default
默认析构函数
virtual bool UpdateSource()=0
更新源属性的值
virtual FieldId GetSourcePropertyId() const =0
获取源属性ID
virtual bool UpdateTarget()=0
更新目标属性的值
数据绑定类
Definition Binding.h:73
void SetBindingObjects(DynamicObject *target, DynamicObject *source)
修改目标对象和源对象
Definition Binding.h:252
void SetBindingMode(BindingMode mode)
修改绑定模式
Definition Binding.h:215
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:439
BindingMode GetBindingMode() const
获取绑定模式
Definition Binding.h:191
DynamicObject * GetTargetObject() const
获取目标对象
Definition Binding.h:199
virtual bool UpdateSource() override
更新源属性的值
Definition Binding.h:162
virtual FieldId GetTargetPropertyId() const override
获取目标属性ID
Definition Binding.h:175
virtual bool UpdateTarget() override
更新目标属性的值
Definition Binding.h:148
DynamicObject * GetSourceObject() const
获取源对象
Definition Binding.h:207
virtual ~Binding()
析构函数
Definition Binding.h:135
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, Binding * >::type
创建延迟绑定对象
Definition Binding.h:702
static auto Create(DynamicObject *target, TTargetProperty TTargetObject::*targetProperty, DynamicObject *source, 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, Binding * >::type
创建绑定对象
Definition Binding.h:591
virtual FieldId GetSourcePropertyId() const override
获取源属性ID
Definition Binding.h:183
static auto Create(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:530
void SetTargetObject(DynamicObject *target)
修改目标对象
Definition Binding.h:226
void SetSourceObject(DynamicObject *source)
修改源对象
Definition Binding.h:239
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, Binding * >::type
创建延迟绑定对象
Definition Binding.h:560
static auto Create(TTargetProperty TTargetObject::*targetProperty, DynamicObject *source, 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, Binding * >::type
创建延迟绑定对象
Definition Binding.h:672
动态对象基类
Definition Reflection.h:27
auto IsType(T **pout=nullptr) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, bool >::type
判断对象是否为指定类型
Definition Reflection.h:85
属性变更通知接口
Definition INotifyPropertyChanged.h:18
PropertyChangedEventHandler PropertyChanged
当属性值更改时触发的事件
Definition INotifyPropertyChanged.h:23
值转换器接口
Definition IValueConverter.h:14
virtual TTarget Convert(TSourceParam source)=0
将源类型转换为目标类型
virtual TSource ConvertBack(TTargetParam target)=0
将目标类型转换为源类型
static auto GetPropertySetter(TProperty T::*prop) -> typename std::enable_if< _IsWritableProperty< TProperty >::value, Delegate< void(DynamicObject &, typename TProperty::TSetterParam)> >::type
获取属性的Setter委托
Definition Reflection.h:1072
static FieldId GetFieldId(TField T::*field) noexcept
获取字段的唯一标识符
Definition Reflection.h:961
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< _IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:1036
表示字段的唯一标识符
Definition Reflection.h:898
判断类型是否为属性的辅助模板
Definition Property.h:95