Simple F# ViewModel for Silverlight MVVM


The wonderful F# Snippets community site continues to be a source of great inspiration, guidance and samples in the practical use of F# in all sorts of domains

The latest addition is a “Simple F# ViewModel for Silverlight MVVM“. F# is an excellent language for implementing Silverlight View Model components and using them in Expression Blend.

Silverlight default architecture is Model-View-ViewModel. This code gives full design time support for Microsoft Expression Blend. The F# ViewModel is seen as strongly typed data source in the Blend UI. There are two properties binded to the view: HiLabel (OneWay data binding) and MyName (TwoWay data binding). ViewModel implements the INotifyPropertyChanged to support the binding. The view project (HelloApp) is made with Blend (by designers) and it is Silverlight 5.0 project. The view codebehind is c# file and it has only this.DataContext -assignment. The viewmodel project (HelloApp.ViewModel) is F# Silverlight 4.0 library. It is made with VS2010 and F# (by developers). It contains the logical functionality of the current view.

[ followed by the code of course. ]

You can also find some good MVVM guidance in the F# Online Templates on Visual Studio Gallery (In Visual Studio 2010, use New Project -> Online Templates -> search for “fsharp”)

don

Comments (2)

  1. Hi Mr. Don Syme

    Thank for your blog of 'Simple F# ViewModel for Silverlight MVVM'.

    I have a Issue about FSharp type indent in WCF enviroment

    When it use with type ident in FSharp coding,  run it in WCF host, and call it from client, the errors occured as below

    System.InvalidOperationException: There was an error while trying to deserialize parameter http://tempuri.org/:….  Please see InnerException for more details. —> System.InvalidOperationException: The initialization of an object or value resulted in an object or value being accessed recursively before it was fully initialized

    //————————————————————

    //It's wrong with type indent

    [<DataContract>]

    type A()=

     [<DefaultValue>] val mutable _Column:string

    [<DataMember>]

     member x.Column

       with get ()=x._Column

       and set v=x._Column<-v  

    [<Sealed>]

    [<DataContract>]

    type B=

     inherit A

     new ()={inherit A()}

     new (para) as x=new B() then  //Type indent is 'x'

       do

         x.Initialize ()  

     member x.Initialize ()= //TODO Initialize

    //————————————————————

    But it's right when it's without type ident!

    [<Sealed>]

    [<DataContract>]

    type B=

     inherit A

     new ()={inherit A()}

     new (para)=new B() then

       do

         //TODO Initialize  

    How can I correct this?

    Thanks & Regards

    Zhou

     

    [ Don says; Hi Zhou, it is best to ask this on http://www.stackoverflow.com ]

  2. Hi Don, thank you for your quick guid.