2016-11-29 81 views
5

在我xaml我有一个按钮和一个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将改变行为,但它没有!

如何控制按钮的行为?

+0

你想做些什么?因为目前的行为是最合乎逻辑的。 –

+0

@FoggyFinder当然是。由于我可以选择将'canExecute'作为参数传递给'CommandAsyncChecked',因此按钮应该执行'canExecute'所说的操作。我认为在这种情况下我的论点更合乎逻辑。你同意吗? –

+1

是的,它确实有道理。 –

回答

6

使得禁用命令同时操作在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 

正常命令的行为都会保持启用状态。

+0

它的工作原理。还有一个问题 - 我如何在混合中编辑'Xaml'?我试图打开混合项目,但它说“不支持.....................” –

+0

@EmonHaque我不认为Blend会支持它,而不会做出一个单独的C#项目,链接/包含xaml文件 - Blend在这方面相当有限。我通常只需手动编辑xaml文件。 –

+0

有没有像'CrystalReport'或'XtraReport'这样的工具在'FsXaml'项目中工作的报告工具? –