// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

#pragma once

namespace CalculatorApp
{
    namespace Common
    {
        /// <summary>
        /// Implementation of <see cref="INotifyPropertyChanged"/> to simplify models.
        /// </summary>
        [Windows::Foundation::Metadata::WebHostHidden] public ref class BindableBase : Windows::UI::Xaml::DependencyObject,
                                                                                       Windows::UI::Xaml::Data::INotifyPropertyChanged,
                                                                                       Windows::UI::Xaml::Data::ICustomPropertyProvider
        {
        public:
            virtual event Windows::UI::Xaml::Data::PropertyChangedEventHandler ^ PropertyChanged;

        public:
            // ICustomPropertyProvider
            virtual Windows::UI::Xaml::Data::ICustomProperty ^ GetCustomProperty(Platform::String ^ name);
            virtual Windows::UI::Xaml::Data::ICustomProperty ^ GetIndexedProperty(Platform::String ^ name, Windows::UI::Xaml::Interop::TypeName type);
            virtual Platform::String ^ GetStringRepresentation();

            property Windows::UI::Xaml::Interop::TypeName Type
            {
                virtual Windows::UI::Xaml::Interop::TypeName get()
                {
                    return this->GetType();
                }
            }

        protected:
            virtual void OnPropertyChanged(Platform::String ^ propertyName);
        };
    }
}
