Emo*_*que 5 f# fsxaml fsharp.viewmodule
在我的xaml我有一个按钮和一个TextBlock
<TextBlock Text="{Binding AText}" FontSize="20"/>
<Button Content="Click" Command="{Binding MyCommand}" Grid.Row="1"/>
Run Code Online (Sandbox Code Playgroud)
在我的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)
Run Code Online (Sandbox Code Playgroud)
当我单击按钮时,它会被禁用并保持不变,直到它完成asyncTask.我认为设置canExecute为true将改变行为,但事实并非如此!
如何控制按钮的行为?
AsyncFSharp.ViewModule中的命令支持是专门设计的,以便命令在操作时禁用,以防止它们多次发生.
如果您不想要这种行为,最简单的选择是只使用普通命令,并手动启动异步工作流:
let asyncTask () = async {
self.AText <- "Loading"
do! Async.Sleep(5000)
self.AText <- "Loaded"
} |> Async.Start
member self.MyCommand = self.Factory.Command asyncTask
Run Code Online (Sandbox Code Playgroud)
正常的命令行为将始终保持启用状态.