public void GetInitializedAndSet_EventHandler_AttachedAndDetached()
        {
            var viewModel1 = new ViewModel { Value = "a" };
            var viewModel2 = new ViewModel { Value = "r" };
            var counter1 = 0;
            var counter2 = 0;

            var backingFileds = new BackingFields(
                s =>
                {
                    if (s == "ViewModelProperty")
                    {
                        counter1++;
                    }
                });

            PropertyChangedEventHandler handler = (source, args) =>
                {
                    if (args.PropertyName == "Value")
                    {
                        counter2++;
                    }
                };

            backingFileds.GetValueAndObserve(() => ViewModelProperty, () => viewModel1, handler);
            Assert.AreEqual(0, counter1);
            Assert.AreEqual(0, counter2);

            viewModel1.Value = "b";
            Assert.AreEqual(0, counter1);
            Assert.AreEqual(1, counter2);

            backingFileds.SetValueAndObserve(() => ViewModelProperty, viewModel2, handler);
            Assert.AreEqual(1, counter1);
            Assert.AreEqual(1, counter2);

            viewModel1.Value = "c";
            Assert.AreEqual(1, counter1);
            Assert.AreEqual(1, counter2);

            viewModel2.Value = "s";
            Assert.AreEqual(1, counter1);
            Assert.AreEqual(2, counter2);
        }
        public void GetInitializedAndSet_Observer_AttachedAndDetached()
        {
            var viewModel1 = new ViewModel { Value = "a" };
            var viewModel2 = new ViewModel { Value = "r" };
            var counter = 0;

            var backingFileds = new BackingFields(
                s =>
                {
                    if (s == "ViewModelProperty")
                    {
                        counter++;
                    }
                });

            backingFileds.GetValueAndObserve(() => ViewModelProperty, () => viewModel1);
            Assert.AreEqual(0, counter);

            viewModel1.Value = "b";
            Assert.AreEqual(1, counter);

            backingFileds.SetValueAndObserve(() => ViewModelProperty, viewModel2);
            Assert.AreEqual(2, counter);

            viewModel1.Value = "c";
            Assert.AreEqual(2, counter);

            viewModel2.Value = "s";
            Assert.AreEqual(3, counter);
        }