2016-11-29 80 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'項目中工作的報告工具? –