3#include "BindingCastHelper.h"
4#include "INotifyObjectDead.h"
5#include "INotifyPropertyChanged.h"
6#include "IValueConverter.h"
101 void (*_converterDeleter)(
void *);
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)) {
283 INotifyObjectDead *targetNotifObjDead =
nullptr;
284 INotifyObjectDead *sourceNotifObjDead =
nullptr;
286 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObjDead)) {
287 targetNotifObjDead->ObjectDead +=
290 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObjDead)) {
291 sourceNotifObjDead->ObjectDead +=
299 void UnregisterNotifications()
301 INotifyPropertyChanged *targetNotifObj =
nullptr;
302 INotifyPropertyChanged *sourceNotifObj =
nullptr;
304 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObj)) {
308 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObj)) {
309 sourceNotifObj->PropertyChanged -=
313 INotifyObjectDead *targetNotifObjDead =
nullptr;
314 INotifyObjectDead *sourceNotifObjDead =
nullptr;
316 if (_targetObject !=
nullptr && _targetObject->
IsType(&targetNotifObjDead)) {
317 targetNotifObjDead->ObjectDead -=
320 if (_sourceObject !=
nullptr && _sourceObject->
IsType(&sourceNotifObjDead)) {
321 sourceNotifObjDead->ObjectDead -=
329 void OnTargetPropertyChanged(INotifyPropertyChanged &sender, PropertyChangedEventArgs &e)
331 if (e.propertyId != _targetPropertyId) {
344 void OnSourcePropertyChanged(INotifyPropertyChanged &sender, PropertyChangedEventArgs &e)
346 if (e.propertyId != _sourcePropertyId) {
359 void OnTargetObjectDead(INotifyObjectDead &sender, EventArgs &e)
367 void OnSourceObjectDead(INotifyObjectDead &sender, EventArgs &e)
375 void OnBindingChanged()
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>
468 binding->_targetObject ==
nullptr ||
469 binding->_sourceObject ==
nullptr) {
494 binding->_targetObject ==
nullptr ||
495 binding->_sourceObject ==
nullptr) {
511 binding->RegisterNotifications();
621 binding->_targetObject ==
nullptr ||
622 binding->_sourceObject ==
nullptr) {
642 binding->_targetObject ==
nullptr ||
643 binding->_sourceObject ==
nullptr) {
653 binding->RegisterNotifications();
数据绑定基类
Definition Binding.h:31
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:66
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 &&!BindingCastHelper< typename TSourceProperty::TValue, typename TTargetProperty::TValue >::value, Binding * >::type
创建绑定对象
Definition Binding.h:592
void SetBindingObjects(DynamicObject *target, DynamicObject *source)
修改目标对象和源对象
Definition Binding.h:252
void SetBindingMode(BindingMode mode)
修改绑定模式
Definition Binding.h:215
BindingMode GetBindingMode() const
获取绑定模式
Definition Binding.h:191
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 &&BindingCastHelper< typename TSourceProperty::TValue, typename TTargetProperty::TValue >::value, Binding * >::type
创建延迟绑定对象
Definition Binding.h:531
DynamicObject * GetTargetObject() const
获取目标对象
Definition Binding.h:199
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 &&BindingCastHelper< typename TSourceProperty::TValue, typename TTargetProperty::TValue >::value, Binding * >::type
创建延迟绑定对象
Definition Binding.h:561
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
virtual FieldId GetSourcePropertyId() const override
获取源属性ID
Definition Binding.h:183
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 &&BindingCastHelper< typename TSourceProperty::TValue, typename TTargetProperty::TValue >::value, Binding * >::type
创建绑定对象
Definition Binding.h:439
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 &&!BindingCastHelper< typename TSourceProperty::TValue, typename TTargetProperty::TValue >::value, Binding * >::type
创建延迟绑定对象
Definition Binding.h:703
void SetTargetObject(DynamicObject *target)
修改目标对象
Definition Binding.h:226
void SetSourceObject(DynamicObject *source)
修改源对象
Definition Binding.h:239
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 &&!BindingCastHelper< typename TSourceProperty::TValue, typename TTargetProperty::TValue >::value, Binding * >::type
创建延迟绑定对象
Definition Binding.h:673
动态对象基类
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:105
属性变更通知接口
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:1341
static FieldId GetFieldId(TField T::*field) noexcept
获取字段的唯一标识符
Definition Reflection.h:1230
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< _IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:1305
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:1175
EventHandler< INotifyObjectDead > ObjectDeadEventHandler
对象销毁事件处理程序类型
Definition INotifyObjectDead.h:14
BindingMode
绑定模式枚举
Definition Binding.h:13
@ OneTime
一次性绑定,在绑定创建时更新目标属性值
EventHandler< INotifyPropertyChanged, PropertyChangedEventArgs > PropertyChangedEventHandler
属性更改事件处理函数类型
Definition INotifyPropertyChanged.h:24
Binding默认转换辅助模板
Definition BindingCastHelper.h:20
表示字段的唯一标识符
Definition Reflection.h:1167
判断类型是否为属性的辅助模板
Definition Property.h:95