5

在我的xaml我有一个 Button 和一个 TextBlock

<TextBlock Text="{Binding AText}" FontSize="20"/>
<Button Content="Click" Command="{Binding MyCommand}" Grid.Row="1"/>

在我的 ViewModel 我有以下代码

let aText = self.Factory.Backing(<@ self.AText @>, "Initial Text")
let asyncTask x = async {
    self.AText <- "Loading"
    do! Async.Sleep(5000)
    self.AText <- "Loaded"
} 

member self.AText with get() = aText.Value and set(v) = aText.Value <- v    
member self.MyCommand = self.Factory.CommandAsyncChecked(asyncTask, fun _ -> true)

当我单击该按钮时,它会被禁用并保持不变,直到完成asyncTask. 我认为设置canExecuteastrue会改变行为,但事实并非如此!

如何控制按钮的行为?

4

1 回答 1

5

FSharp.ViewModule 中的Async命令支持是专门设计的,以便在操作时禁用命令,以防止它们多次发生。

如果您不希望这种行为,最简单的选择是使用普通命令,然后手动启动异步工作流程:

let asyncTask () = async {
    self.AText <- "Loading"
    do! Async.Sleep(5000)
    self.AText <- "Loaded"
} |> Async.Start

member self.MyCommand = self.Factory.Command asyncTask

正常的命令行为将始终保持启用状态。

于 2016-11-29T20:08:32.760 回答