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

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

parent 5207ee25
...@@ -44,7 +44,7 @@ namespace Misc ...@@ -44,7 +44,7 @@ namespace Misc
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) =>
...@@ -62,7 +62,7 @@ namespace Misc ...@@ -62,7 +62,7 @@ namespace Misc
func(); func();
src.PropertyChanged += (s, e) => src.PropertyChanged += (s, e) =>
{ {
if (srcPropertyName==e.PropertyName) if (srcPropertyName == e.PropertyName)
{ {
func(); func();
} }
...@@ -79,6 +79,105 @@ namespace Misc ...@@ -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) public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, INotifyPropertyChanged target, string targetPropertyName, BindingMode mode)
{ {
Type type_s = src.GetType(); Type type_s = src.GetType();
...@@ -92,10 +191,11 @@ namespace Misc ...@@ -92,10 +191,11 @@ namespace Misc
{ {
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;
} }
} }
......
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