gpt4 book ai didi

wpf - F# wpf 异步命令完成状态

转载 作者:行者123 更新时间:2023-12-04 21:44:39 25 4
gpt4 key购买 nike

我一直在使用 F# Viewmodule 尝试异步命令。问题是当我单击按钮时,命令被执行,但之后按钮保持禁用状态。

Xaml:

<Button Content="start async worker" Command="{Binding StartAsyncCommand}" />

View 模型:

type MainViewModel() as me = 
inherit ViewModelBase()
//...
member __.StartAsyncCommand = me.Factory.CommandAsync(fun _ -> async { return () } )

我做错了什么?

编辑:

感谢@FoggyFinder,我们确定问题实际上出在 App.fs 文件上:

open System
open FsXaml
open System.Windows

type MainWindow = XAML< "MainWindow.xaml">

[<STAThread>]
[<EntryPoint>]
let main argv =
Application().Run(MainWindow().Root)

创建基本上空的 App.xaml 并像这样开始:

module main

open System
open FsXaml

type App = XAML<"App.xaml">

[<STAThread>]
[<EntryPoint>]
let main argv =
App().Root.Run()

修复了它。如果有人知道对此的解释,请随时提供。

最佳答案

What am I doing wrong?

问题在于,当您构建 ViewModel 层时,没有 SynchronizationContext,这意味着将事物推回到 UI 上下文的内部代码无法正常工作。

您可以通过在调用 Application.Run() 之前在入口点的开头添加以下内容来解决此问题:

if SynchronizationContext.Current = null then
DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher)
|> SynchronizationContext.SetSynchronizationContext

这将确保创建 Dispatcher 并安装有效的 SynchronizationContext,并且可能会为您解决问题。

关于wpf - F# wpf 异步命令完成状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35554054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com