Click here to Skip to main content
15,886,362 members
Home / Discussions / C#
   

C#

 
QuestionClose Reactive extensions buffers Pin
Kenneth Haugland5-Mar-16 0:04
mvaKenneth Haugland5-Mar-16 0:04 
AnswerRe: Close Reactive extensions buffers Pin
Pete O'Hanlon6-Mar-16 20:32
mvePete O'Hanlon6-Mar-16 20:32 
GeneralRe: Close Reactive extensions buffers Pin
Kenneth Haugland6-Mar-16 22:15
mvaKenneth Haugland6-Mar-16 22:15 
QuestionWeak Event seems to fail in test method Pin
Super Lloyd4-Mar-16 17:02
Super Lloyd4-Mar-16 17:02 
AnswerRe: Weak Event seems to fail in test method Pin
Kenneth Haugland4-Mar-16 23:58
mvaKenneth Haugland4-Mar-16 23:58 
GeneralRe: Weak Event seems to fail in test method Pin
Super Lloyd5-Mar-16 15:42
Super Lloyd5-Mar-16 15:42 
GeneralRe: Weak Event seems to fail in test method Pin
Super Lloyd5-Mar-16 15:43
Super Lloyd5-Mar-16 15:43 
GeneralRe: Weak Event seems to fail in test method Pin
Super Lloyd5-Mar-16 15:45
Super Lloyd5-Mar-16 15:45 
full source code, for your understanding!
C#
public class PropertyPath<TProp> : PropertyPath
    {
        internal PropertyPath()
        {
        }
        public new TProp Value
        {
            get
            {
                var v = base.Value;
                if (v is TProp)
                    return (TProp)v;
                return default(TProp);
            }
            set { base.Value = value; }
        }
    }
    public class PropertyPath : ModelBase
    {
        public static PropertyPath<TP> Link<T, TP>(T root, Expression<Func<T, TP>> e, Action<TP> onValueChanged)
        {
            var pv = new PropertyPath<TP>();
            pv.PropertyChanged += (o, eargs) =>
            {
                if (string.IsNullOrEmpty(eargs.PropertyName) || eargs.PropertyName == "Value")
                {
                    onValueChanged(pv.Value);
                }
            };
            pv.Initialize(e);
            pv.Root = root;
            return pv;
        }
        public static PropertyPath<TP> Link<TP>(Expression<Func<TP>> e, Action<TP> onValueChanged)
        {
            var pv = new PropertyPath<TP>();
            pv.PropertyChanged += (o, eargs) =>
            {
                if (string.IsNullOrEmpty(eargs.PropertyName) || eargs.PropertyName == "Value")
                {
                    onValueChanged(pv.Value);
                }
            };
            pv.Initialize(e);
            return pv;
        }

        public static PropertyPath<TP> Create<T, TP>(T root, Expression<Func<T, TP>> e)
        {
            var pv = new PropertyPath<TP>();
            pv.Initialize(e);
            pv.Root = root;
            return pv;
        }
        public static PropertyPath<TP> Create<TP>(Expression<Func<TP>> e)
        {
            var pv = new PropertyPath<TP>();
            pv.Initialize(e);
            return pv;
        }

        internal PropertyPath()
        {
        }
        void Initialize(LambdaExpression e)
        {
            object root;
            var path = ReflectionEx.GetLambdaPath(e, out root);
            if (path.Length == 0)
                throw new ArgumentException();
            pvalues = new PropertyValue[path.Length];
            roValues = new ReadOnlyCollection<PropertyValue>(pvalues);
            for (int i = 0; i < path.Length; i++)
            {
                var meIndex = i;
                var pv = new PropertyValue(this, i, path[i]);
                pvalues[i] = pv;
            }
            Root = root;
        }

        PropertyValue[] pvalues;
        ReadOnlyCollection<PropertyValue> roValues;

        public object Root
        {
            get { return root; }
            set
            {
                if (Equals(Root, value))
                    return;
                if (value != null && !pvalues[0].Member.DeclaringType.IsInstanceOf(value))
                    throw new InvalidCastException();
                root = value;
                pvalues[0].Object = root;
                OnPropertyChanged();
            }
        }
        object root;

        public object Value
        {
            get { return pvalues[pvalues.Length - 1].Value; }
            set { pvalues[pvalues.Length - 1].Value = value; }
        }

        public ReadOnlyCollection<PropertyValue> Elements { get { return roValues; } }

        #region class PropertyValue

        public class PropertyValue
        {
            internal PropertyValue(PropertyPath path, int index, MemberInfo member)
            {
                this.index = index;
                Path = path;
                Member = member;
            }
            int index;
            public PropertyPath Path { get; private set; }
            public MemberInfo Member { get; private set; }
            public string Name { get { return Member.Name; } }

            void SetMemberValue(object value)
            {
                if (Member is FieldInfo)
                    ((FieldInfo)Member).SetValue(Object, value);
                else if (Member is PropertyInfo)
                    ((PropertyInfo)Member).SetValue(Object, value);
                else
                    throw new InvalidOperationException();
            }
            object GetMemberValue()
            {
                if (Member is FieldInfo)
                    return ((FieldInfo)Member).GetValue(Object);
                else if (Member is PropertyInfo)
                    return ((PropertyInfo)Member).GetValue(Object, null);
                else
                    throw new InvalidOperationException();
            }

            public object Object
            {
                get { return mObject; }
                internal set
                {
                    if (value == mObject)
                        return;

                    if (mObject is INotifyPropertyChanged)
                    {
                        ((INotifyPropertyChanged)mObject).PropertyChanged -= watcher;
                    }
                    mObject = value;
                    UpdateValue();
                    if (mObject is INotifyPropertyChanged)
                    {
                        watcher = WeakEvents.AddWeakHandler((INotifyPropertyChanged)mObject, this, (x, args) =>
                        {
                            if (args.PropertyName == null || args.PropertyName == x.Name)
                                x.UpdateValue();
                        });
                    }
                }
            }
            object mObject;
            PropertyChangedEventHandler watcher;

            void UpdateValue()
            {
                var v = GetMemberValue();
                if (Equals(v, Value))
                    return;
                mValue = v;
                OnValueChanged();
            }

            public object Value
            {
                get { return mValue; }
                internal set
                {
                    if (Equals(value, Value))
                        return;
                    SetMemberValue(value);
                    mValue = value;
                    OnValueChanged();
                }
            }
            object mValue;

            void OnValueChanged()
            {
                if (index == Path.Elements.Count - 1)
                    Path.OnPropertyChanged(nameof(Value));
                else
                    Path.Elements[index + 1].Object = Value;
                ValueChanged?.Invoke(this, EventArgs.Empty);
            }
            public event EventHandler ValueChanged;
        }

        #endregion
    }
All in one Menu-Ribbon Bar
DirectX for WinRT/C# since 2013!
Taking over the world since 1371!

GeneralRe: Weak Event seems to fail in test method Pin
Super Lloyd5-Mar-16 17:12
Super Lloyd5-Mar-16 17:12 
GeneralRe: Weak Event seems to fail in test method Pin
Kenneth Haugland5-Mar-16 17:22
mvaKenneth Haugland5-Mar-16 17:22 
GeneralRe: Weak Event seems to fail in test method Pin
Super Lloyd5-Mar-16 17:28
Super Lloyd5-Mar-16 17:28 
GeneralRe: Weak Event seems to fail in test method Pin
Kenneth Haugland5-Mar-16 17:44
mvaKenneth Haugland5-Mar-16 17:44 
GeneralRe: Weak Event seems to fail in test method Pin
Super Lloyd5-Mar-16 18:11
Super Lloyd5-Mar-16 18:11 
QuestionHow to connect MySQL to dataGridView Pin
Member 122785423-Mar-16 19:48
Member 122785423-Mar-16 19:48 
AnswerRe: How to connect MySQL to dataGridView Pin
Mycroft Holmes3-Mar-16 20:34
professionalMycroft Holmes3-Mar-16 20:34 
AnswerRe: How to connect MySQL to dataGridView Pin
V.3-Mar-16 22:53
professionalV.3-Mar-16 22:53 
AnswerRe: How to connect MySQL to dataGridView Pin
Frank Kerrigan4-Mar-16 3:50
Frank Kerrigan4-Mar-16 3:50 
Questionscalar data visualization Pin
Member 123014432-Mar-16 23:12
Member 123014432-Mar-16 23:12 
AnswerRe: scalar data visualization Pin
OriginalGriff2-Mar-16 23:24
mveOriginalGriff2-Mar-16 23:24 
GeneralRe: scalar data visualization Pin
Member 123014433-Mar-16 17:49
Member 123014433-Mar-16 17:49 
AnswerRe: scalar data visualization Pin
dan!sh 3-Mar-16 18:01
professional dan!sh 3-Mar-16 18:01 
GeneralRe: scalar data visualization Pin
Pete O'Hanlon3-Mar-16 23:41
mvePete O'Hanlon3-Mar-16 23:41 
GeneralRe: scalar data visualization Pin
Sascha Lefèvre3-Mar-16 0:55
professionalSascha Lefèvre3-Mar-16 0:55 
GeneralRe: scalar data visualization Pin
Mycroft Holmes3-Mar-16 19:22
professionalMycroft Holmes3-Mar-16 19:22 
GeneralRe: scalar data visualization Pin
Sascha Lefèvre3-Mar-16 23:23
professionalSascha Lefèvre3-Mar-16 23:23 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.