2016-01-09 6 views
8

F#で書かれたビューモデルでDelegateCommandを呼び出す方法の例はありますか?しかし、F#に新しいもの、私はこの実装を使用するかどうかわからない、または他のいくつかのがある場合ViewmodelでDelegateCommandを使用するには?

type DelegateCommand<a>(execute : 'a -> unit, ?canExecute : 'a -> bool) = 
    let event = Event<_,_>() 
    interface ICommand with 
    member this.CanExecute(param : obj) = 
     if canExecute.IsSome then 
     canExecute.Value(param :> 'a) 
     else true 
    member this.Execute (param : obj) = 
     execute(param :> 'a) 

:私はDelegateCommand実装here次のコードを発見した

私が活用するべきアプローチ。

は、ここで私はDelegateCommandを実行する方法を見つけ出すたら私が実行したいテストです:

module CreateProfileViewModel.Tests 

open FsUnit 
open NUnit.Framework 
open CreateProfile.UILogic 

[<Test>] 
let ``create profile``() = 

    // Setup 
    let viewModel = ViewModel() 
    viewModel.FirstName <- "Scott" 
    viewModel.LastName <- "Nimrod" 

    // Test 
    viewModel.Submit.Execute(); 

    // Verify 
    let expected = false // TODO - implement some state-change 
    expected |> should equal true 

私のviewmodelは以下の通りです:

module CreateProfile 

open Core.UILogic 

type ViewModel() = 
    inherit ViewModelBase() 
    let mutable firstName = "" 
    let mutable lastName = "" 

    member this.FirstName 
     with get() = firstName 
     and set(value) = 
      firstName <- value 
      base.NotifyPropertyChanged(<@ this.FirstName @>) 

    member this.LastName 
     with get() = lastName 
     and set(value) = 
      lastName <- value 
      base.NotifyPropertyChanged(<@ this.LastName @>) 

私が持っています次のベースビューモデル:

module Core.UILogic 

open System.ComponentModel 
open Microsoft.FSharp.Quotations.Patterns 

type ViewModelBase() = 
    let propertyChanged = 
     Event<PropertyChangedEventHandler,PropertyChangedEventArgs>() 

    let getPropertyName = function 
     | PropertyGet(_,pi,_) -> pi.Name 
     | _ -> invalidOp "Expecting property getter expression" 

    interface INotifyPropertyChanged with 
     [<CLIEvent>] 
     member this.PropertyChanged = propertyChanged.Publish 

    member private this.NotifyPropertyChanged propertyName = 
     propertyChanged.Trigger(this,PropertyChangedEventArgs(propertyName)) 

    member this.NotifyPropertyChanged quotation = 
     quotation |> getPropertyName |> this.NotifyPropertyChanged 

アップデート:私は次のようにF#のためMVVMプロジェクトテンプレートで定義されたRelayCommandを変更した

module UILogic.Interaction 

open System 
open System.Windows 
open System.Windows.Input 
open System.ComponentModel 

type DelegateCommand (action:(obj -> unit), canExecute:(obj -> bool)) = 
    let event = new DelegateEvent<EventHandler>() 
    interface ICommand with 
     [<CLIEvent>] 
     member this.CanExecuteChanged = event.Publish 
     member this.CanExecute arg = canExecute(arg) 
     member this.Execute arg = action(arg) 
次のように私はその後、私ののviewmodelを更新

module CreateProfile.UILogic 

open UILogic.State 
open UILogic.Interaction 

type ViewModel() = 
    inherit ViewModelBase() 

    let mutable _firstName = "" 
    let mutable _lastName = "" 
    let mutable _submitted = false 

    member this.FirstName 
     with get() = _firstName 
     and set(value) = 
      _firstName <- value 
      base.NotifyPropertyChanged(<@ this.FirstName @>) 

    member this.LastName 
     with get() = _lastName 
     and set(value) = 
      _lastName <- value 
      base.NotifyPropertyChanged(<@ this.LastName @>) 

    member this.IsSubmitted 
     with get() = _submitted 
     and set(value) = _submitted <- value 

    member this.Submit = 
     new DelegateCommand ((fun _ -> this.IsSubmitted <- true), (fun _ -> true)) 

はしかし、私が提出(DelegateCommand)上で実行する関数を起動する方法がわからないです:

module CreateProfileViewModel.Tests 

open FsUnit 
open NUnit.Framework 
open UILogic.State 
open CreateProfile.UILogic 

[<Test>] 
let ``create profile``() = 

    // Setup 
    let viewModel = ViewModel() 
    viewModel.FirstName <- "Scott" 
    viewModel.LastName <- "Nimrod" 

    // Test 
    ignore viewModel.Submit.Execute(); // How to invoke execute? 

    // Verify 
    viewModel.IsSubmitted |> should equal true 

私は、これは簡単ですけど、私は正直にこれを行う方法を見当もつかない。

提案がありますか?

+0

は、なぜあなたは既製のソリューションを使用していませんか? - フォギーファインダー@ FSharp.ViewModule –

+0

:私は本当に理解したいと私の開発、実際にF#のコマンド。 Guy Coderは素晴らしいリファレンスを提供しました。私は現在、その実装を研究していますので、この言語とその仕組みを吸収しようとしています。 –

+0

あなたの質問は何ですか?どこに問題がありますか? –

答えて

関連する問題