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

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

parent 5207ee25
......@@ -44,7 +44,7 @@ namespace Misc
if (pi_s == null)
return;
object obj = pi_s.GetValue(src,null);
object obj = pi_s.GetValue(src, null);
target[index] = obj;
src.PropertyChanged += (s, e) =>
......@@ -62,7 +62,7 @@ namespace Misc
func();
src.PropertyChanged += (s, e) =>
{
if (srcPropertyName==e.PropertyName)
if (srcPropertyName == e.PropertyName)
{
func();
}
......@@ -79,6 +79,105 @@ namespace Misc
}
};
}
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();
......@@ -92,10 +191,11 @@ namespace Misc
{
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);
src.PropertyChanged += (s, e) =>
PropertyChangedEventHandler pcevent;
src.PropertyChanged += pcevent = (s, e) =>
{
if (e.PropertyName == srcPropertyName)
{
......@@ -103,13 +203,25 @@ namespace Misc
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
{
object obj = pi_s.GetValue(src,null);
object obj = pi_s.GetValue(src, null);
pi_t.SetValue(target, obj, null);
src.PropertyChanged += (s, e) =>
PropertyChangedEventHandler pcevent;
src.PropertyChanged += pcevent = (s, e) =>
{
if (e.PropertyName == srcPropertyName)
{
......@@ -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)
{
......@@ -126,7 +248,18 @@ namespace Misc
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;
}
}
......
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