如何在执行异步任务时保持按钮启用
How to keep button enabled while performing asynchronous task
在我的 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
。我认为将 canExecute
设置为 true
会改变行为,但事实并非如此!
如何控制按钮的行为?
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
正常命令行为将始终保持启用状态。
在我的 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
。我认为将 canExecute
设置为 true
会改变行为,但事实并非如此!
如何控制按钮的行为?
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
正常命令行为将始终保持启用状态。