Xamarin.iOS+MvvmCross を VB で作る

これに「VB でも作れますよ」の返答をしたいだけに、Xamarin.iOS で VB を使ってみました。まあ、正確には、

  • ViewModel を VB の PCL で作る
  • フロントを Xamarin.iOS の C# で作る

訳で、アプリ全体を VB では作ってはいませんが。F# の場合、アプリ全体も作れるので、なんとか工夫すれば VB でも作れると思うのですが、View 部分をコードで書かないといけないし、結構面倒なことになるので、VB+C# のハイブリッド型ということです。Xamarin + Microsoft が C# 押しをしている(ように見えるのは)単一言語で同一の .NET Framework(One.NET)で使えるよ~、という意味で、入り口の取り方としては Java と似ているかなと。多様性という点では、C#/VB/F# と揃っていたほうがいいし、Visual Basic には C# の後追いじゃなくて初心の「初心者にも使える」を押してほしいなと思ったり。この話は別途書くつもり。

フロントエンドは C# のまま

Xamarin.iOS+MvvmCrossでstoryboardを使う方法(MvvmCross v3.2.2 対応) | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6685

で作ったものを流用します。できれば、プロジェクトの参照設定だけを VB の PCL に変えればいいのですが、最初から作ったのでいくつか嵌りました(汗)。

storyboard ファイルを、C# のプロジェクトからコピーしたものの、Main Interface に設定するのを忘れていて、画面が真っ黒になってあれ?と悩んだり、

Xamarin.iOS が 64bit 化の過渡期なので、MvvmCross が monotouch を要求するので Xamarin.iOS と差し換えたりと。

さっくり 30 分で作って返答するつもりが、夜中に2時間ほどかかっていましたよ。

バックエンドを VB で作る

ViewModel を VB の PCL で作ります。Xamarin Studio では完結しないので、ここでは Visual Studio を使います。まあ、もともと Windows 版の Xamarin Studio では Xamarin.iOS の開発ができないので、Mac 上のものを使うのですが、このあたりは、適当に使い慣れたほうをベースにするのが良いかと。

Namespace ViewModels
    Public Interface ICaluculation
        Function TipAmount(subTotal As Double, generosity As Integer) As Double
    End Interface

    Public Class Calculation
        Implements ICaluculation

        Public Function TipAmount(subTotal As Double, generosity As Integer) As Double Implements ICaluculation.TipAmount
            Return subTotal * CType(generosity, Double) / 100.0
        End Function
    End Class

    Public Class TipViewModel
        Inherits MvxViewModel

        Private _calculation As ICaluculation
        Public Sub New()
            _calculation = New Calculation()
            Start()
        End Sub

        Public Overloads Sub Start()
            _subTotal = 100.0
            _generosity = 10
            Me.Recalcuate()
            MyBase.Start()
        End Sub

        Private _subTotal As Double
        Private _generosity As Integer
        Private _tip As Double

        Public Property SubTotal As Double
            Get
                Return _subTotal
            End Get
            Set(value As Double)
                _subTotal = value
                RaisePropertyChanged(Function() SubTotal)
                Recalcuate()
            End Set
        End Property

        Public Property Generosity As Integer
            Get
                Return _generosity
            End Get
            Set(value As Integer)
                _generosity = value
                RaisePropertyChanged(Function() Generosity)
                Recalcuate()
            End Set
        End Property

        Public Property Tip As Double
            Get
                Return _tip
            End Get
            Set(value As Double)
                _tip = value
                RaisePropertyChanged(Function() Tip)
            End Set
        End Property

        Private Sub Recalcuate()
            Tip = _calculation.TipAmount(SubTotal, Generosity)
        End Sub
    End Class
End Namespace

RaisePropertyChanged メソッドに引き渡すラムダ式の書き方をちょっと悩みますが、Function() SubTotal な感じ書きます。式木になるので、Function() … End Fuction ではダメなのですね。素直にプロパティ名を文字列で書いてもいいかもしれません。

例によって、App クラスの中身は空っぽです。

Public Class App
    Inherits MvxApplication
    Public Sub New()

    End Sub
End Class

実行する

iOS はこんな感じ

Android はこんな感じ

サンプルコード

MxSingleApp 内の MvxVB.* の類がそれです
https://github.com/moonmile/MxSingleApp

カテゴリー: VB, Xamarin パーマリンク