f# - 如何在执行异步任务时保持按钮启用

标签 f# fsxaml fsharp.viewmodule

在我的 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 .我以为设置canExecutetrue会改变行为,但它没有!

如何控制按钮的行为?

最佳答案

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

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

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

member self.MyCommand = self.Factory.Command asyncTask

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

关于f# - 如何在执行异步任务时保持按钮启用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40874626/

相关文章:

wpf - 使用 FSharp.ViewModule 关闭对话框

wpf - 无法加载 FsXaml.Wpf.TypeProvider

f# - 如何将 F# 中的模块导入限制在本地范围内?

parsing - 在 F# 中使用标记/符号实现用于构建非常简单的树 (AST) 的函数

wpf - 在 F# WPF MVVM 应用程序中绑定(bind)到 TextBox 的 TextChanged 事件

f# - 在 FsXaml 和 ElmishWPF 中更新 ProgressBar.Value

wpf - F# WPF : Handling click events in ListBox

list - 追加到列表 F# 的开头

f# - 为什么有些 FAKE 方法在目标函数中不起作用?

f# - 我可以将 FsXaml 与 .NET 4.0 一起使用吗?