3#include "INotifyObjectDead.h"
4#include "INotifyPropertyChanged.h"
5#include "IValueConverter.h"
100 void (*_converterDeleter)(
void *);
129 UnregisterNotifications();
131 if (_converterDeleter && _converter) {
132 _converterDeleter(_converter);
144 if (_updateTargetFunc) {
145 result = _updateTargetFunc(
this);
158 if (_updateSourceFunc) {
159 result = _updateSourceFunc(
this);
169 return _targetPropertyId;
177 return _sourcePropertyId;
193 return _targetObject;
201 return _sourceObject;
220 if (_targetObject != target) {
221 UnregisterNotifications();
222 _targetObject = target;
223 RegisterNotifications();
233 if (_sourceObject != source) {
234 UnregisterNotifications();
235 _sourceObject = source;
236 RegisterNotifications();
246 if (_targetObject != target ||
247 _sourceObject != source)
249 UnregisterNotifications();
250 _targetObject = target;
251 _sourceObject = source;
252 RegisterNotifications();
261 void RegisterNotifications()
266 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObj)) {
270 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObj)) {
275 INotifyObjectDead *targetNotifObjDead =
nullptr;
276 INotifyObjectDead *sourceNotifObjDead =
nullptr;
278 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObjDead)) {
279 targetNotifObjDead->ObjectDead +=
282 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObjDead)) {
283 sourceNotifObjDead->ObjectDead +=
291 void UnregisterNotifications()
293 INotifyPropertyChanged *targetNotifObj =
nullptr;
294 INotifyPropertyChanged *sourceNotifObj =
nullptr;
296 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObj)) {
300 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObj)) {
301 sourceNotifObj->PropertyChanged -=
305 INotifyObjectDead *targetNotifObjDead =
nullptr;
306 INotifyObjectDead *sourceNotifObjDead =
nullptr;
308 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObjDead)) {
309 targetNotifObjDead->ObjectDead -=
312 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObjDead)) {
313 sourceNotifObjDead->ObjectDead -=
321 void OnTargetPropertyChanged(INotifyPropertyChanged &sender, PropertyChangedEventArgs &e)
323 if (e.propertyId != _targetPropertyId) {
336 void OnSourcePropertyChanged(INotifyPropertyChanged &sender, PropertyChangedEventArgs &e)
338 if (e.propertyId != _sourcePropertyId) {
351 void OnTargetObjectDead(INotifyObjectDead &sender, EventArgs &e)
359 void OnSourceObjectDead(INotifyObjectDead &sender, EventArgs &e)
367 void OnBindingChanged()
393 template <
typename TTargetValue,
typename TSourceValue>
394 static Binding *Create(DynamicObject *target, FieldId targetPropertyId,
395 DynamicObject *source, FieldId sourcePropertyId,
396 BindingMode mode, IValueConverter<TSourceValue, TTargetValue> *converter)
398 auto binding =
new Binding;
400 binding->_targetObject = target;
401 binding->_sourceObject = source;
402 binding->_targetPropertyId = targetPropertyId;
403 binding->_sourcePropertyId = sourcePropertyId;
405 binding->_mode = mode;
406 binding->_converter = converter;
408 binding->_converterDeleter = [](
void *ptr) {
409 delete reinterpret_cast<IValueConverter<TSourceValue, TTargetValue> *
>(ptr);
427 typename TTargetObject,
428 typename TTargetProperty,
429 typename TSourceObject,
430 typename TSourceProperty>
459 binding->_targetObject ==
nullptr ||
460 binding->_sourceObject ==
nullptr) {
485 binding->_targetObject ==
nullptr ||
486 binding->_sourceObject ==
nullptr) {
502 binding->RegisterNotifications();
612 binding->_targetObject ==
nullptr ||
613 binding->_sourceObject ==
nullptr) {
633 binding->_targetObject ==
nullptr ||
634 binding->_sourceObject ==
nullptr) {
644 binding->RegisterNotifications();
数据绑定基类
Definition Binding.h:30
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:65
void SetBindingObjects(DynamicObject *target, DynamicObject *source)
修改目标对象和源对象
Definition Binding.h:244
void SetBindingMode(BindingMode mode)
修改绑定模式
Definition Binding.h:207
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:431
BindingMode GetBindingMode() const
获取绑定模式
Definition Binding.h:183
DynamicObject * GetTargetObject() const
获取目标对象
Definition Binding.h:191
virtual bool UpdateSource() override
更新源属性的值
Definition Binding.h:154
virtual FieldId GetTargetPropertyId() const override
获取目标属性ID
Definition Binding.h:167
virtual bool UpdateTarget() override
更新目标属性的值
Definition Binding.h:140
DynamicObject * GetSourceObject() const
获取源对象
Definition Binding.h:199
virtual ~Binding()
析构函数
Definition Binding.h:127
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:694
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:583
virtual FieldId GetSourcePropertyId() const override
获取源属性ID
Definition Binding.h:175
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:522
void SetTargetObject(DynamicObject *target)
修改目标对象
Definition Binding.h:218
void SetSourceObject(DynamicObject *source)
修改源对象
Definition Binding.h:231
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:552
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:664
动态对象基类
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:30
const Event< PropertyChangedEventHandler > PropertyChanged
当属性值更改时触发的事件
Definition INotifyPropertyChanged.h:35
值转换器接口
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:1194
static FieldId GetFieldId(TField T::*field) noexcept
获取字段的唯一标识符
Definition Reflection.h:1083
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< _IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:1158
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
typename _FuncTypeHelper< typename _FuncTraits< Types... >::TArgsTuple >::template TFunc< typename _FuncTraits< Types... >::TRet > Func
Func类型别名,类似C::中的Func<T1, T2, ..., TResult>
Definition Delegate.h:1124
EventHandler< INotifyObjectDead > ObjectDeadEventHandler
对象销毁事件处理程序类型
Definition INotifyObjectDead.h:14
BindingMode
绑定模式枚举
Definition Binding.h:12
@ OneTime
一次性绑定,在绑定创建时更新目标属性值
EventHandler< INotifyPropertyChanged, PropertyChangedEventArgs > PropertyChangedEventHandler
属性更改事件处理函数类型
Definition INotifyPropertyChanged.h:24
表示字段的唯一标识符
Definition Reflection.h:1020
判断类型是否为属性的辅助模板
Definition Property.h:95