8

ボタンのコマンドをアクションにバインドした後、progress イベントを公開するオブジェクトを呼び出します。

event System.EventHandler<ProgressChangedEventArgs> ProgressChanged

それを XAML で最良の方法で表示したいと思います。


1 つの方法は、VM で 2 つのバインド可能なフィールドを公開することです

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

それは2つの質問につながります:

  • 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 に答える