using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections;
namespace Misc
{
public class BindingOperations
{
// 摘要:
// 描述绑定中数据流的方向。
public enum BindingMode
{
// 摘要:
// 导致对源属性或目标属性的更改可自动更新对方。此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。
TwoWay = 0,
//
// 摘要:
// 当绑定源(源)更改时,更新绑定目标(目标)属性。如果要绑定的控件为隐式只读控件,则适用此绑定类型。例如,可以绑定到如股市代号之类的源。或者,可能目标属性没有用于进行更改(例如表的数据绑定背景色)的控件接口。如果不需要监视目标属性的更改,则使用
// System.Windows.Data.BindingMode.OneWay 绑定模式可避免 System.Windows.Data.BindingMode.TwoWay
// 绑定模式的系统开销。
OneWay = 1
}
///
/// 当绑定源(源)更改时,更新绑定目标(目标)属性
///
///
///
///
///
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, INotifyPropertyChanged target, string targetPropertyName)
{
SetBinding(src, srcPropertyName, target, targetPropertyName, BindingMode.OneWay);
}
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, IList target, int index)
{
Type type_s = src.GetType();
Type type_t = target.GetType();
System.Reflection.PropertyInfo pi_s = type_s.GetProperty(srcPropertyName);
if (pi_s == null)
return;
object obj = pi_s.GetValue(src,null);
target[index] = obj;
src.PropertyChanged += (s, e) =>
{
if (e.PropertyName == srcPropertyName)
{
object o = pi_s.GetValue(src, null);
target[index] = obj;
}
};
}
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, Action func)
{
func();
src.PropertyChanged += (s, e) =>
{
if (srcPropertyName==e.PropertyName)
{
func();
}
};
}
public static void SetBinding(INotifyPropertyChanged src, string[] srcPropertyNames, Action func)
{
func();
src.PropertyChanged += (s, e) =>
{
if (srcPropertyNames.Contains(e.PropertyName))
{
func();
}
};
}
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, INotifyPropertyChanged target, string targetPropertyName, BindingMode mode)
{
Type type_s = src.GetType();
Type type_t = target.GetType();
System.Reflection.PropertyInfo pi_s = type_s.GetProperty(srcPropertyName);
System.Reflection.PropertyInfo pi_t = type_t.GetProperty(targetPropertyName);
if (pi_s == null || pi_t == null)
return;
switch (mode)
{
case BindingMode.OneWay://src->target
{
object obj = pi_s.GetValue(src,null);
pi_t.SetValue(target, obj, null);
src.PropertyChanged += (s, e) =>
{
if (e.PropertyName == srcPropertyName)
{
object o = pi_s.GetValue(src, null);
pi_t.SetValue(target, o, null);
}
};
}break;
case BindingMode.TwoWay://src->target then target->src
{
object obj = pi_s.GetValue(src,null);
pi_t.SetValue(target, obj, null);
src.PropertyChanged += (s, e) =>
{
if (e.PropertyName == srcPropertyName)
{
object o = pi_s.GetValue(s, null);
pi_t.SetValue(target, o, null);
}
};
target.PropertyChanged += (s, e) =>
{
if (e.PropertyName == targetPropertyName)
{
object o = pi_t.GetValue(s, null);
pi_s.SetValue(src, o, null);
}
};
}break;
}
}
public static void SetBinding(INotifyPropertyChanged src, string srcPropertyName, ParamDictionary target, string targetPropertyName, BindingMode mode)
{
Type type_s = src.GetType();
System.Reflection.PropertyInfo pi_s = type_s.GetProperty(srcPropertyName);
if (pi_s == null)
return;
switch (mode)
{
case BindingMode.OneWay://src->target
{
object obj = pi_s.GetValue(src, null);
target.SetValue(targetPropertyName, obj);
src.PropertyChanged += (s, e) =>
{
if (e.PropertyName == srcPropertyName)
{
object o = pi_s.GetValue(src, null);
target.SetValue(targetPropertyName, obj);
}
};
}
break;
case BindingMode.TwoWay://src->target then target->src
{
object obj = pi_s.GetValue(src, null);
target.SetValue(targetPropertyName, obj);
src.PropertyChanged += (s, e) =>
{
if (e.PropertyName == srcPropertyName)
{
object o = pi_s.GetValue(s, null);
target.SetValue(targetPropertyName, obj);
}
};
target.ValueChanged += (s, e) =>
{
if (e.Key == targetPropertyName)
{
object o = target.GetValue(pi_s.PropertyType, targetPropertyName);
pi_s.SetValue(src, o, null);
}
};
}
break;
}
}
}
}