@yusuke_kokubo そんなことはないですよ?F#も使えます。
— Openゆとり?( ・?・)? ?? (@megascus) 2014, 12月 1
これに「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
実行する
サンプルコード
MxSingleApp 内の MvxVB.* の類がそれです
https://github.com/moonmile/MxSingleApp




