有没有关于如何在用F#编写的viewmodel上调用DelegateCommand的示例?
我已经找到了一个DelegateCommand执行下面的代码在这里:
type DelegateCommand(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)
但是,作为F#的新手,我不确定是否应该使用此实现,或者我是否应该利用其他方法.
这是我想知道如何执行DelegateCommand后要执行的测试:
module CreateProfileViewModel.Tests open FsUnit open NUnit.Framework open CreateProfile.UILogic [] 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 @>)
我有以下base-viewmodel:
module Core.UILogic open System.ComponentModel open Microsoft.FSharp.Quotations.Patterns type ViewModelBase () = let propertyChanged = Event() let getPropertyName = function | PropertyGet(_,pi,_) -> pi.Name | _ -> invalidOp "Expecting property getter expression" interface INotifyPropertyChanged with [ ] 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() interface ICommand with [ ] 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))
但是,我不确定如何在Submit(DelegateCommand)上调用Execute函数:
module CreateProfileViewModel.Tests open FsUnit open NUnit.Framework open UILogic.State open CreateProfile.UILogic [] 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
我知道这是微不足道的,但老实说,我不知道如何做到这一点.
有什么建议?