SimpleWindow
载入中...
搜索中...
未找到
DataBinding.h
1#pragma once
2
3#include "FrameworkElement.h"
4
5namespace sw
6{
11 {
12 private:
16 FrameworkElement *_targetElement;
17
21 std::unique_ptr<Binding> _innerBinding;
22
23 private:
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
83 {
84 return _innerBinding->GetBindingMode();
85 }
86
91 {
92 _innerBinding->SetBindingMode(mode);
93 }
94
100 {
101 return _targetElement;
102 }
103
109 {
110 if (_targetElement != element) {
111 UnregisterNotifications();
112 _targetElement = element;
113 UpdateDataContextBinding();
114 RegisterNotifications();
115 }
116 }
117
118 private:
122 void RegisterNotifications()
123 {
124 if (_targetElement == nullptr) {
125 return;
126 }
127
128 _targetElement->ObjectDead +=
129 ObjectDeadEventHandler(*this, &DataBinding::OnTargetElementDead);
130
131 _targetElement->DataContextChanged +=
132 DataContextChangedEventHandler(*this, &DataBinding::OnTargetElementDataContextChanged);
133 }
134
138 void UnregisterNotifications()
139 {
140 if (_targetElement == nullptr) {
141 return;
142 }
143
144 _targetElement->ObjectDead -=
145 ObjectDeadEventHandler(*this, &DataBinding::OnTargetElementDead);
146
147 _targetElement->DataContextChanged -=
148 DataContextChangedEventHandler(*this, &DataBinding::OnTargetElementDataContextChanged);
149 }
150
154 void UpdateDataContextBinding()
155 {
156 if (_targetElement == nullptr) {
157 _innerBinding->SetBindingObjects(nullptr, nullptr);
158 } else {
159 _innerBinding->SetBindingObjects(_targetElement, _targetElement->CurrentDataContext);
160 }
161 }
162
166 void OnTargetElementDead(INotifyObjectDead &sender, EventArgs &e)
167 {
168 SetTargetObject(nullptr);
169 }
170
174 void OnTargetElementDataContextChanged(FrameworkElement &sender, DataContextChangedEventArgs &e)
175 {
176 UpdateDataContextBinding();
177 }
178
179 public:
192
202 template <
203 typename TTargetObject,
204 typename TTargetProperty,
205 typename TSourceObject,
206 typename TSourceProperty>
221
231 template <
232 typename TTargetObject,
233 typename TTargetProperty,
234 typename TSourceObject,
235 typename TSourceProperty>
250 };
251}
数据绑定基类
Definition Binding.h:31
数据绑定类
Definition Binding.h:66
数据绑定,用于UI元素与DataContext之间的属性绑定
Definition DataBinding.h:11
virtual FieldId GetTargetPropertyId() const override
获取目标属性ID
Definition DataBinding.h:66
void SetBindingMode(BindingMode mode)
设置绑定模式
Definition DataBinding.h:90
BindingMode GetBindingMode() const
获取绑定模式
Definition DataBinding.h:82
virtual bool UpdateSource() override
更新源属性的值
Definition DataBinding.h:58
virtual ~DataBinding()
析构函数
Definition DataBinding.h:40
static DataBinding * Create(FrameworkElement *targetElement, Binding *binding)
创建数据绑定对象
Definition DataBinding.h:187
FrameworkElement * GetTargetObject() const
获取目标元素
Definition DataBinding.h:99
void SetTargetObject(FrameworkElement *element)
设置目标元素
Definition DataBinding.h:108
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, DataBinding * >::type
创建数据绑定对象
Definition DataBinding.h:236
virtual FieldId GetSourcePropertyId() const override
获取源属性ID
Definition DataBinding.h:74
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, DataBinding * >::type
创建数据绑定对象
Definition DataBinding.h:207
virtual bool UpdateTarget() override
更新目标属性的值
Definition DataBinding.h:49
动态对象基类
Definition Reflection.h:27
框架元素类,提供数据上下文和绑定功能
Definition FrameworkElement.h:37
const Event< DataContextChangedEventHandler > DataContextChanged
数据上下文改变时触发该事件
Definition FrameworkElement.h:63
const ReadOnlyProperty< DynamicObject * > CurrentDataContext
当前元素的有效数据上下文
Definition FrameworkElement.h:82
const Event< ObjectDeadEventHandler > ObjectDead
对象销毁时触发该事件
Definition INotifyObjectDead.h:25
值转换器接口
Definition IValueConverter.h:14
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
EventHandler< INotifyObjectDead > ObjectDeadEventHandler
对象销毁事件处理程序类型
Definition INotifyObjectDead.h:14
BindingMode
绑定模式枚举
Definition Binding.h:13
EventHandler< FrameworkElement, DataContextChangedEventArgs > DataContextChangedEventHandler
数据上下文更改事件处理函数类型
Definition FrameworkElement.h:30
Binding默认转换辅助模板
Definition BindingCastHelper.h:20
表示字段的唯一标识符
Definition Reflection.h:1167
判断类型是否为属性的辅助模板
Definition Property.h:95