Commit 0c240d5f authored by 潘栩锋's avatar 潘栩锋 🚴

修复 属性绑定,添加卸载功能

parent 5207ee25
...@@ -9,7 +9,7 @@ namespace Misc ...@@ -9,7 +9,7 @@ namespace Misc
{ {
public class BindingOperations public class BindingOperations
{ {
// 摘要: // 摘要:
// 描述绑定中数据流的方向。 // 描述绑定中数据流的方向。
public enum BindingMode public enum BindingMode
...@@ -31,11 +31,11 @@ namespace Misc ...@@ -31,11 +31,11 @@ namespace Misc
/// <param name="srcPropertyName"></param> /// <param name="srcPropertyName"></param>
/// <param name="target"></param> /// <param name="target"></param>
/// <param name="targetPropertyName"></param> /// <param name="targetPropertyName"></param>
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, INotifyPropertyChanged target, string targetPropertyName) public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, INotifyPropertyChanged target, string targetPropertyName)
{ {
SetBinding(src, srcPropertyName, target, targetPropertyName, BindingMode.OneWay); SetBinding(src, srcPropertyName, target, targetPropertyName, BindingMode.OneWay);
} }
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, IList target, int index) public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, IList target, int index)
{ {
Type type_s = src.GetType(); Type type_s = src.GetType();
...@@ -43,8 +43,8 @@ namespace Misc ...@@ -43,8 +43,8 @@ namespace Misc
System.Reflection.PropertyInfo pi_s = type_s.GetProperty(srcPropertyName); System.Reflection.PropertyInfo pi_s = type_s.GetProperty(srcPropertyName);
if (pi_s == null) if (pi_s == null)
return; return;
object obj = pi_s.GetValue(src,null); object obj = pi_s.GetValue(src, null);
target[index] = obj; target[index] = obj;
src.PropertyChanged += (s, e) => src.PropertyChanged += (s, e) =>
...@@ -55,31 +55,130 @@ namespace Misc ...@@ -55,31 +55,130 @@ namespace Misc
target[index] = obj; target[index] = obj;
} }
}; };
} }
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, Action func) public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, Action func)
{ {
func(); func();
src.PropertyChanged += (s, e) => src.PropertyChanged += (s, e) =>
{ {
if (srcPropertyName==e.PropertyName) if (srcPropertyName == e.PropertyName)
{ {
func(); func();
} }
}; };
} }
public static void SetBinding(INotifyPropertyChanged src, string[] srcPropertyNames, Action func) public static void SetBinding(INotifyPropertyChanged src, string[] srcPropertyNames, Action func)
{ {
func(); func();
src.PropertyChanged += (s, e) => src.PropertyChanged += (s, e) =>
{ {
if (srcPropertyNames.Contains(e.PropertyName)) if (srcPropertyNames.Contains(e.PropertyName))
{ {
func(); func();
} }
}; };
} }
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, INotifyPropertyChanged target, string targetPropertyName, BindingMode mode)
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, object target, Action func)
{
func();
PropertyChangedEventHandler pcevent;
src.PropertyChanged += pcevent = (s, e) =>
{
if (srcPropertyName == e.PropertyName)
{
func();
}
};
if (IsMarkdownEvents)
{
if (!bindingConexts.ContainsKey(target))
{
bindingConexts.Add(target, new List<PropertyChangedEventContexts>());
}
var list = bindingConexts[target];
list.Add(new PropertyChangedEventContexts() { src = src, propertyChanged = pcevent });
}
}
public static void SetBinding(INotifyPropertyChanged src, string[] srcPropertyNames, object target, Action func)
{
func();
PropertyChangedEventHandler pcevent;
src.PropertyChanged += pcevent = (s, e) =>
{
if (srcPropertyNames.Contains(e.PropertyName))
{
func();
}
};
if (IsMarkdownEvents)
{
if (!bindingConexts.ContainsKey(target))
{
bindingConexts.Add(target, new List<PropertyChangedEventContexts>());
}
var list = bindingConexts[target];
list.Add(new PropertyChangedEventContexts() { src = src, propertyChanged = pcevent });
}
}
public class PropertyChangedEventContexts
{
public INotifyPropertyChanged src;
public PropertyChangedEventHandler propertyChanged;
}
static Dictionary<object, List<PropertyChangedEventContexts>> bindingConexts;
static bool IsMarkdownEvents = false;
/// <summary>
/// 开始记录事件
/// </summary>
public static void StartMarkdownEvents(Dictionary<object, List<PropertyChangedEventContexts>> bindingConexts)
{
IsMarkdownEvents = true;
BindingOperations.bindingConexts = bindingConexts;
}
/// <summary>
/// 停止记录事件
/// </summary>
public static void StopMarkdownEvents()
{
IsMarkdownEvents = false;
BindingOperations.bindingConexts = null;
}
/// <summary>
/// 释放事件目标对象
/// </summary>
/// <param name="src"></param>
public static void DisposeEventTargetObject(Dictionary<object, List<PropertyChangedEventContexts>> bindingConexts, object target)
{
if (!bindingConexts.ContainsKey(target))
return;
var list = bindingConexts[target];
foreach (var context in list)
{
context.src.PropertyChanged -= context.propertyChanged;
}
bindingConexts.Remove(target);
}
/// <summary>
/// 释放事件目标对象
/// </summary>
/// <param name="src"></param>
public static void DisposeEventTargetObject(Dictionary<object, List<PropertyChangedEventContexts>> bindingConexts)
{
foreach (var list in bindingConexts.Values)
{
foreach (var context in list)
{
context.src.PropertyChanged -= context.propertyChanged;
}
}
bindingConexts.Clear();
}
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, INotifyPropertyChanged target, string targetPropertyName, BindingMode mode)
{ {
Type type_s = src.GetType(); Type type_s = src.GetType();
Type type_t = target.GetType(); Type type_t = target.GetType();
...@@ -87,15 +186,16 @@ namespace Misc ...@@ -87,15 +186,16 @@ namespace Misc
System.Reflection.PropertyInfo pi_t = type_t.GetProperty(targetPropertyName); System.Reflection.PropertyInfo pi_t = type_t.GetProperty(targetPropertyName);
if (pi_s == null || pi_t == null) if (pi_s == null || pi_t == null)
return; return;
switch (mode) switch (mode)
{ {
case BindingMode.OneWay://src->target case BindingMode.OneWay://src->target
{ {
object obj = pi_s.GetValue(src,null); object obj = pi_s.GetValue(src, null);
pi_t.SetValue(target, obj, null); pi_t.SetValue(target, obj, null);
src.PropertyChanged += (s, e) => PropertyChangedEventHandler pcevent;
src.PropertyChanged += pcevent = (s, e) =>
{ {
if (e.PropertyName == srcPropertyName) if (e.PropertyName == srcPropertyName)
{ {
...@@ -103,13 +203,25 @@ namespace Misc ...@@ -103,13 +203,25 @@ namespace Misc
pi_t.SetValue(target, o, null); pi_t.SetValue(target, o, null);
} }
}; };
}break;
if (IsMarkdownEvents)
{
if (!bindingConexts.ContainsKey(target))
{
bindingConexts.Add(target, new List<PropertyChangedEventContexts>());
}
var list = bindingConexts[target];
list.Add(new PropertyChangedEventContexts() { src = src, propertyChanged = pcevent });
}
}
break;
case BindingMode.TwoWay://src->target then target->src case BindingMode.TwoWay://src->target then target->src
{ {
object obj = pi_s.GetValue(src,null); object obj = pi_s.GetValue(src, null);
pi_t.SetValue(target, obj, null); pi_t.SetValue(target, obj, null);
src.PropertyChanged += (s, e) => PropertyChangedEventHandler pcevent;
src.PropertyChanged += pcevent = (s, e) =>
{ {
if (e.PropertyName == srcPropertyName) if (e.PropertyName == srcPropertyName)
{ {
...@@ -118,7 +230,17 @@ namespace Misc ...@@ -118,7 +230,17 @@ namespace Misc
} }
}; };
target.PropertyChanged += (s, e) => if (IsMarkdownEvents)
{
if (!bindingConexts.ContainsKey(target))
{
bindingConexts.Add(target, new List<PropertyChangedEventContexts>());
}
var list = bindingConexts[target];
list.Add(new PropertyChangedEventContexts() { src = src, propertyChanged = pcevent });
}
target.PropertyChanged += pcevent = (s, e) =>
{ {
if (e.PropertyName == targetPropertyName) if (e.PropertyName == targetPropertyName)
{ {
...@@ -126,7 +248,18 @@ namespace Misc ...@@ -126,7 +248,18 @@ namespace Misc
pi_s.SetValue(src, o, null); pi_s.SetValue(src, o, null);
} }
}; };
}break;
if (IsMarkdownEvents)
{
if (!bindingConexts.ContainsKey(src))
{
bindingConexts.Add(src, new List<PropertyChangedEventContexts>());
}
var list = bindingConexts[src];
list.Add(new PropertyChangedEventContexts() { src = target, propertyChanged = pcevent });
}
}
break;
} }
} }
...@@ -143,7 +276,7 @@ namespace Misc ...@@ -143,7 +276,7 @@ namespace Misc
{ {
object obj = pi_s.GetValue(src, null); object obj = pi_s.GetValue(src, null);
target.SetValue(targetPropertyName, obj); target.SetValue(targetPropertyName, obj);
src.PropertyChanged += (s, e) => src.PropertyChanged += (s, e) =>
{ {
if (e.PropertyName == srcPropertyName) if (e.PropertyName == srcPropertyName)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment