声明性进度条绑定

nic*_*las 8 wpf xaml f#

在将按钮的命令绑定到动作之后,我调用一个公开progress事件的对象.

event System.EventHandler<ProgressChangedEventArgs> ProgressChanged
Run Code Online (Sandbox Code Playgroud)

我想以最好的方式在我的XAML中显示它.


一种方法是在我的VM中公开两个可绑定字段

member x.Iteration with get()     = _iteration
                   and set(v:int) = _iteration <- v
                                    x.NotifyPropertyChanged <@this.Iteration@>

member x.IterationVisible with get()      = _iterationVisible
                          and set(v:bool) = _iterationVisible <- v
                                            x.NotifyPropertyChanged <@this.IterationVisible@>
Run Code Online (Sandbox Code Playgroud)

然后我被调用来执行动作我只会更新属性

member x.CompleteInference(algorithm:IGeneratedAlgorithm) =
    x.IterationVisible <- true
    algorithm.ProgressChanged.Add(fun args -> x.Iteration <- args.Iteration)
    algorithm.run()
    x.IterationVisible <- false
Run Code Online (Sandbox Code Playgroud)

这导致了两个问题:

  • 是否有一个直接的方式F#揭露progressChanged事件,而无需通过这种中间去Iteration属性,可以通过WPF来处理?它是我们可以得到/做的最具声明性的我们总是要在某个地方存储一些状态吗?

  • 另外,是否有一种自然的方式来完全在XAML中进行 "状态机"绑定?

N_A*_*N_A 1

据我所知,没有办法在 xaml 中处理事件,因此通过属性公开事件更改可能是您能做的最好的事情。

要在 xaml 中实现“状态机绑定”,您可以将进度公开为大小,然后将进度条的宽度绑定到该属性。请参阅此处的示例。