Home

Awesome

Ammy is an application framework for XAML based platforms

How to install

install-package Ammy.XamarinForms

(other platforms coming soon)

Main values

Hello World example

public class App : Application {
    public App() => MainPage = new HelloWorld();
}

public class HelloWorld : AmmyPage
{
    public override View BuildContent()
    {
        var currentValue = CreateBindableValue("World");

        return StackLayout.Children(
                        Entry.Text(currentValue),
                        Label.Text(currentValue, v => "Hello, " + v)
               );
    }
}

preview

As you can see, both data and presentation are in the same method. But don't get your pitchforks up - IT'S OKAY. Your data still doesn't know anything about the view and most of the communication is still done with binding. Although now it's easier to navigate between the view and the code.

Won't it become unreadable when I add more UI?

Unlike with XAML, you can easily extract stuff away. Visual Studio has built-in refactorings for that.

    public override View BuildContent()
    {
        return StackLayout.Children(
                    Header("My application name"),
                    Label.Text("Content")
               );
    }

    public Grid Header(string applicationName) 
    {
        return Grid.Children(
                    Label.Text(applicationName)
               )
    }

Note that both methods can have separate data and logic.

Commands and interaction

You can pass labmda function to the Command extension method and it will be executed on click.

    public override View BuildContent()
    {
        var counter = CreateBindableValue(0);

        // define local function for Button's Command
        void increment() => counter.Value++;

        return StackLayout.Children(
                    Label.Text(counter),
                    Button.Text("Increment")
                            .Command(increment)
               );
    }

You can still use the good old ICommand interface if you want.

preview

Validation

Validation is done by BindableValue<T> and BindableModel<T>.

    public override View BuildContent()
    {
        var summerMonth = CreateBindableValue("", validateSummerMonth);

        void validateSummerMonth(string month, Validator<string> validator) {
            if (month != "June" && month != "July" && month != "August")
                validator.AddError("Month can either be June, July or August");
        }

        return StackLayout.Children(
                    Entry.Text(summerMonth),
                    Label.Text(summerMonth.ValidationMessage)
               );
    }

preview