将按钮的命令绑定到动作后,我调用一个公开进度事件的对象。
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 来完成“状态机”绑定?
答案 0 :(得分:1)
据我所知,无法处理xaml中的事件,因此通过属性公开事件更改可能是您可以做的最好的事情。
要在xaml中实现“'状态机'绑定”,您可以将进度公开为大小,然后将进度条的宽度绑定到该属性。有关此示例,请参阅here。
答案 1 :(得分:1)
虽然我是F#的新手,但你看起来正确地做到了这一点。
Wpf通常与MVVM模式一起使用,因此将按钮连接到命令属性,将进度条连接到int属性是正确的。然后,您的命令会执行某些操作以使进度值发生更改,并且绑定会处理其余部分。
处理xaml中的事件需要代码隐藏,如果它仅用于增强UI,我个人不会介意。它当然不应该与其他对象进行交互。这意味着没有事件处理程序。
这会引发可用于将控制事件绑定到命令的命令行为。请参阅msdn。
希望这在某种程度上有所帮助。