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
私は、これは簡単ですけど、私は正直にこれを行う方法を見当もつかない。
提案がありますか?
は、なぜあなたは既製のソリューションを使用していませんか? - フォギーファインダー@ FSharp.ViewModule –
:私は本当に理解したいと私の開発、実際にF#のコマンド。 Guy Coderは素晴らしいリファレンスを提供しました。私は現在、その実装を研究していますので、この言語とその仕組みを吸収しようとしています。 –
あなたの質問は何ですか?どこに問題がありますか? –