声明性进度条绑定

时间:2013-03-25 12:15:51

标签: wpf xaml f#

将按钮的命令绑定到动作后,我调用一个公开进度事件的对象。

event System.EventHandler<ProgressChangedEventArgs> ProgressChanged

我想以最好的方式在我的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@>

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

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

这导致了两个问题:

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

  • 另外,是否有一种自然的方法可以完全用 XAML 来完成“状态机”绑定?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

虽然我是F#的新手,但你看起来正确地做到了这一点。

Wpf通常与MVVM模式一起使用,因此将按钮连接到命令属性,将进度条连接到int属性是正确的。然后,您的命令会执行某些操作以使进度值发生更改,并且绑定会处理其余部分。

处理xaml中的事件需要代码隐藏,如果它仅用于增强UI,我个人不会介意。它当然不应该与其他对象进行交互。这意味着没有事件处理程序。

这会引发可用于将控制事件绑定到命令的命令行为。请参阅msdn

希望这在某种程度上有所帮助。