F# and MVVM Light Toolkit Sample Application

MVVM Light Toolkitを使ってViewModelとModelをF#で記述した足し算を行うだけのシンプルなアプリケーションの実装例です。サンプルアプリケーションは以下のような形のものになります。以下に、サンプルに含まれるプロジェクトの概要を示します。 Okazuki.Fsharp.Mvvmプロジェクト(C#)F#でのViewModelの定義を楽にするためのヘルパークラスを定義したViewModelの基本クラスを定義しています。 Okazuki.Fsharp.Mvvm.Sample(C#)MVVM Light Toolkitをベースにしたプ

 
 
 
 
 
(0)
250 times
Add to favorites
6/21/2011
E-mail Twitter del.icio.us Digg Facebook

Solution explorer

C#, F#
namespace Okazuki.Fsharp.Mvvm
{
    using System;
    using GalaSoft.MvvmLight;
    using GalaSoft.MvvmLight.Command;

    /// <summary>
    /// F#でのViewModelの定義の簡略化のためのメソッドを追加したViewModelの基本クラス。
    /// </summary>
    public class FsViewModelBase : ViewModelBase
    {
        /// <summary>
        /// プロパティの値の設定と変更通知を行います。
        /// </summary>
        /// <typeparam name="T">プロパティの型</typeparam>
        /// <param name="field">フィールド</param>
        /// <param name="value">プロパティにセットする値</param>
        /// <param name="propertyName">プロパティ名</param>
        protected void SetAndNotify<T>(ref T field, T value, string propertyName)
        {
            if (Equals(field, value))
            {
                return;
            }

            field = value;
            base.RaisePropertyChanged(propertyName);
        }

        /// <summary>
        /// RelayCommandを作成、または取得します。
        /// </summary>
        /// <param name="field">フィールド</param>
        /// <param name="execute">コマンドの実行メソッド</param>
        /// <param name="canExecute">コマンドの実行可否判定メソッド</param>
        /// <returns>作成または取得されたコマンド</returns>
        protected RelayCommand GetOrCreateCommand(
            ref RelayCommand field,
            Action execute,
            Func<bool> canExecute)
        {
            if (field != null)
            {
                return field;
            }

            return field = new RelayCommand(execute, canExecute);
        }

        /// <summary>
        /// RelayCommandを作成、または取得します。
        /// </summary>
        /// <param name="field">フィールド</param>
        /// <param name="execute">コマンドの実行メソッド</param>
        /// <returns>作成または取得されたコマンド</returns>
        protected RelayCommand GetOrCreateCommand(
            ref RelayCommand field,
            Action execute)
        {
            return GetOrCreateCommand(ref field, execute, () => true);
        }

        /// <summary>
        /// RelayCommandを作成、または取得します。
        /// </summary>
        /// <typeparam name="T">コマンドの引数の型</typeparam>
        /// <param name="field">フィールド</param>
        /// <param name="execute">コマンドの実行メソッド</param>
        /// <param name="canExecute">コマンドの実行可否判定メソッド</param>
        /// <returns>作成または取得されたコマンド</returns>
        protected RelayCommand<T> GetOrCreateCommand<T>(
            ref RelayCommand<T> field,
            Action<T> execute,
            Predicate<T> canExecute)
        {
            if (field != null)
            {
                return field;
            }

            return field = new RelayCommand<T>(execute, canExecute);
        }

        /// <summary>
        /// RelayCommandを作成、または取得します。
        /// </summary>
        /// <typeparam name="T">コマンドの引数の型</typeparam>
        /// <param name="field">フィールド</param>
        /// <param name="execute">コマンドの実行メソッド</param>
        /// <returns>作成または取得されたコマンド</returns>
        protected RelayCommand<T> GetOrCreateCommand<T>(
            ref RelayCommand<T> field,
            Action<T> execute)
        {
            return GetOrCreateCommand<T>(ref field, execute, v => true);
        }
    }
}