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: {
404 typename TTargetObject,
405 typename TTargetProperty,
406 typename TSourceObject,
407 typename TSourceProperty>
409 DynamicObject *source, TSourceProperty TSourceObject::*sourceProperty,
411 IValueConverter<typename TSourceProperty::TValue, typename TTargetProperty::TValue> *converter = nullptr)
412 -> typename std::enable_if<
417 std::is_same<typename TTargetProperty::TValue, typename TSourceProperty::TValue>::value,
420 using TTargetValue =
typename TTargetProperty::TValue;
421 using TSourceValue =
typename TSourceProperty::TValue;
424 binding->_mode = mode;
426 binding->_targetObject = target;
427 binding->_sourceObject = source;
431 binding->_converter = converter;
432 binding->_converterDeleter = [](
void *ptr) {
443 if (targetSetter ==
nullptr ||
444 sourceGetter ==
nullptr ||
445 binding->_targetObject ==
nullptr ||
446 binding->_sourceObject ==
nullptr) {
452 *binding->_targetObject,
453 converter->
Convert(sourceGetter(*binding->_sourceObject)));
456 *binding->_targetObject,
457 sourceGetter(*binding->_sourceObject));
469 if (targetGetter ==
nullptr ||
470 sourceSetter ==
nullptr ||
471 binding->_targetObject ==
nullptr ||
472 binding->_sourceObject ==
nullptr) {
478 *binding->_sourceObject,
479 converter->
ConvertBack(targetGetter(*binding->_targetObject)));
482 *binding->_sourceObject,
483 targetGetter(*binding->_targetObject));
488 binding->RegisterNotifications();
489 binding->OnBindingChanged();
504 typename TTargetObject,
505 typename TTargetProperty,
506 typename TSourceObject,
507 typename TSourceProperty>
508 static auto Create(TTargetProperty TTargetObject::*targetProperty,
510 TSourceProperty TSourceObject::*sourceProperty,
512 IValueConverter<typename TSourceProperty::TValue, typename TTargetProperty::TValue> *converter = nullptr)
513 -> typename std::enable_if<
518 std::is_same<typename TTargetProperty::TValue, typename TSourceProperty::TValue>::value,
521 return Create(
nullptr, targetProperty, source, sourceProperty, mode, converter);
534 typename TTargetObject,
535 typename TTargetProperty,
536 typename TSourceObject,
537 typename TSourceProperty>
538 static auto Create(TTargetProperty TTargetObject::*targetProperty,
539 TSourceProperty TSourceObject::*sourceProperty,
541 IValueConverter<typename TSourceProperty::TValue, typename TTargetProperty::TValue> *converter = nullptr)
542 -> typename std::enable_if<
547 std::is_same<typename TTargetProperty::TValue, typename TSourceProperty::TValue>::value,
550 return Create(
nullptr, targetProperty,
nullptr, sourceProperty, mode, converter);
565 typename TTargetObject,
566 typename TTargetProperty,
567 typename TSourceObject,
568 typename TSourceProperty>
570 DynamicObject *source, TSourceProperty TSourceObject::*sourceProperty,
572 IValueConverter<typename TSourceProperty::TValue, typename TTargetProperty::TValue> *converter)
573 -> typename std::enable_if<
578 !std::is_same<typename TTargetProperty::TValue, typename TSourceProperty::TValue>::value,
581 using TTargetValue =
typename TTargetProperty::TValue;
582 using TSourceValue =
typename TSourceProperty::TValue;
585 binding->_mode = mode;
587 binding->_targetObject = target;
588 binding->_sourceObject = source;
592 binding->_converter = converter;
593 binding->_converterDeleter = [](
void *ptr) {
604 if (targetSetter ==
nullptr ||
605 sourceGetter ==
nullptr ||
606 converter ==
nullptr ||
607 binding->_targetObject ==
nullptr ||
608 binding->_sourceObject ==
nullptr) {
613 *binding->_targetObject,
614 converter->
Convert(sourceGetter(*binding->_sourceObject)));
625 if (targetGetter ==
nullptr ||
626 sourceSetter ==
nullptr ||
627 converter ==
nullptr ||
628 binding->_targetObject ==
nullptr ||
629 binding->_sourceObject ==
nullptr) {
634 *binding->_sourceObject,
635 converter->
ConvertBack(targetGetter(*binding->_targetObject)));
639 binding->RegisterNotifications();
640 binding->OnBindingChanged();
655 typename TTargetObject,
656 typename TTargetProperty,
657 typename TSourceObject,
658 typename TSourceProperty>
659 static auto Create(TTargetProperty TTargetObject::*targetProperty,
661 TSourceProperty TSourceObject::*sourceProperty,
663 IValueConverter<typename TSourceProperty::TValue, typename TTargetProperty::TValue> *converter)
664 -> typename std::enable_if<
669 !std::is_same<typename TTargetProperty::TValue, typename TSourceProperty::TValue>::value,
672 return Create(
nullptr, targetProperty, source, sourceProperty, mode, converter);
685 typename TTargetObject,
686 typename TTargetProperty,
687 typename TSourceObject,
688 typename TSourceProperty>
689 static auto Create(TTargetProperty TTargetObject::*targetProperty,
690 TSourceProperty TSourceObject::*sourceProperty,
692 IValueConverter<typename TSourceProperty::TValue, typename TTargetProperty::TValue> *converter)
693 -> typename std::enable_if<
698 !std::is_same<typename TTargetProperty::TValue, typename TSourceProperty::TValue>::value,
701 return Create(
nullptr, targetProperty,
nullptr, sourceProperty, mode, converter);
数据绑定基类
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:408
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:689
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:569
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:508
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:538
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:659
动态对象基类
Definition Reflection.h:26
bool IsType(T **pout=nullptr)
判断对象是否为指定类型
Definition Reflection.h:53
属性变更通知接口
Definition INotifyPropertyChanged.h:18
PropertyChangedEventHandler PropertyChanged
当属性值更改时触发的事件
Definition INotifyPropertyChanged.h:23
值转换器接口
Definition IValueConverter.h:20
virtual TTarget Convert(TSourceParam source)=0
将源类型转换为目标类型
virtual TSource ConvertBack(TTargetParam target)=0
将目标类型转换为源类型
static FieldId GetFieldId(TField T::*field) noexcept
获取字段的唯一标识符
Definition Reflection.h:237
static auto GetPropertySetter(TProperty T::*prop) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&_IsWritableProperty< TProperty >::value, Delegate< void(DynamicObject &, typename TProperty::TSetterParam)> >::type
获取属性的Setter委托
Definition Reflection.h:354
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&_IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:318
表示字段的唯一标识符
Definition Reflection.h:177
判断类型是否为属性的辅助模板
Definition Property.h:94