/// <summary>
        /// Creates an <see cref="ObservableValue{T}"/> available via data binding, affected by a source observable, with late materialization
        /// of the observable logic.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="viewModel"></param>
        /// <param name="name"></param>
        /// <param name="inputObservableSelector"></param>
        /// <param name="initialValue"></param>
        /// <returns></returns>
        public static ObservableValue <T> CreateProperty <T>(
            this BaseViewModel viewModel,
            string name,
            Func <IObservable <T>, IObservable <T> > inputObservableSelector,
            T initialValue = default(T))
        {
            var observableValue = new ObservableValue <T>(initialValue);

            viewModel.AddProperty <T>(name, observableValue);
            viewModel.AddTrigger(ViewModelState.Loaded, () => observableValue.AddInput(inputObservableSelector));

            return(observableValue);
        }