ionoy / Ammy2

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Ammy is an application framework for XAML based platforms

How to install

install-package Ammy.XamarinForms

(other platforms coming soon)

Main values

  • Code should be readable. As few boilerplate as possible.
  • Code should be reusable. Do not repeat yourself. Make sure to separate common patterns for later reuse.
  • Code should be local. Easily switch between the UI and corresponding application logic.
  • Code should be live Write code live, without restarting your application. (this requires LiveSharp extension)

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

About

License:MIT License


Languages

Language:C# 93.4%Language:HTML 4.2%Language:CSS 2.3%Language:Batchfile 0.1%