Example #1
0
        /// <summary>
        /// Bind two objects implementing INotifyPropertyChanged over given properties
        /// </summary>
        /// <param name="source">source object</param>
        /// <param name="sourcePropertyName">source property name</param>
        /// <param name="target">target object</param>
        /// <param name="targetPropertyName">target property name</param>
        /// <param name="bindmode">binding mode, e.g. BindingMode.TwoWay</param>
        public static void BindProperties(INotifyPropertyChanged source, string sourcePropertyName, INotifyPropertyChanged target, string targetPropertyName, BindingMode bindMode = BindingMode.TwoWay)
        {
            switch (bindMode)
            {
            case BindingMode.OneTime:
                target.SetProperty(targetPropertyName, source.GetProperty(sourcePropertyName)); //just set value once
                break;

            case BindingMode.OneWay:
                source.PropertyChanged += (s, e) => { if (e.PropertyName == sourcePropertyName)
                                                      {
                                                          target.SetProperty(targetPropertyName, source.GetProperty(sourcePropertyName));
                                                      }
                };                                                                                           //bind forward...
                BindProperties(source, sourcePropertyName, target, targetPropertyName, BindingMode.OneTime); //...then set value (target may have looped back to us and changed our value, in that case we read that latest value from source and set to target)
                break;

            case BindingMode.TwoWay:
                target.PropertyChanged += (s, e) => { if (e.PropertyName == targetPropertyName)
                                                      {
                                                          source.SetProperty(sourcePropertyName, target.GetProperty(targetPropertyName));
                                                      }
                };                                                                                          //reverse bind
                BindProperties(source, sourcePropertyName, target, targetPropertyName, BindingMode.OneWay); //bind forward and then set value
                break;

            default:
                throw new NotSupportedException("Unsupported binding mode");
            }
        }
Example #2
0
 public static void SetProperty <T>(this INotifyPropertyChanged source,
                                    Expression <Func <T> > propExpr,
                                    ref T propertyValueHolder,
                                    T value) where T : class
 {
     source.SetProperty(propExpr, ref propertyValueHolder, value, () => { });
 }