8

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

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事件,而不通过这个中间Iteration属性,可以由 WPF 处理?它是我们能得到的最具声明性的吗/我们总是必须在某处存储一些状态吗?

  • 另外,是否有一种自然的方法可以完全在XAML中进行这种“状态机”绑定?

4

2 回答 2

1

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

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

于 2013-03-26T14:40:52.980 回答
1

尽管我是 F# 新手,但您看起来这样做是正确的。

Wpf 通常与 MVVM 模式一起使用,因此将按钮连接到命令属性并将进度条连接到 int 属性是正确的。然后你的命令会做一些事情来改变进度值,而绑定会处理剩下的事情。

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

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

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

于 2014-07-14T21:36:02.150 回答