public PropertyTester(Lifetime lifetime, PropertyProvider propertyProvider)
        {
            _propertyProvider = propertyProvider;
            _propertyProvider.SomeIntProperty.BeforeChange.Advise(lifetime, args =>
            {
                if (args.New < 0)
                {
                    args.Cancel = true;
                }
            });

            _propertyProvider.SomeIntProperty.Change.Advise_HasNew(lifetime,
                                                                   val => MessageBox.ShowInfo($"New property value is {val.New}"));
        }
        public PropertyViewModel(Lifetime lifetime)
        {
            // SomeIntProperty of the PropertyProvider instance is updated via the SomeIntProperty of PropertyViewModel
            // which, in turn, is updated from PropertyView via WPF binding
            SomeIntProperty = new Property <int>(lifetime, "PropertyViewModel.SomeIntProperty")
            {
                Value = 0
            };

            var propProvider = new PropertyProvider(lifetime);

            SomeIntProperty.FlowInto(lifetime, propProvider.SomeIntProperty);

            var propTester = new PropertyTester(lifetime, propProvider);


            // IProperty FlowChangesInto example
            SourceProperty = new Property <string>(lifetime, "PropertyViewModel.SourceProperty");
            TargetProperty = new Property <string>(lifetime, "PropertyViewModel.TargetProperty");
            var propFlow = new PropertyFlow(lifetime);

            SourceProperty.FlowInto(lifetime, propFlow.SourceProperty);
            propFlow.TargetProperty.FlowInto(lifetime, TargetProperty);
        }