2013-03-25 11 views
8

ボタンのコマンドをアクションにバインドした後、私はプログレスイベントを公開するオブジェクトを呼び出します。宣言的プログレスバーバインディング

event System.EventHandler<ProgressChangedEventArgs> ProgressChanged 

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


一つの方法は、私はちょうど性質

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

を更新してしまうし、私がアクションを実行するために呼ばれています私のVMに2つのバインド可能なフィールド

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

member x.IterationVisible with get()  = _iterationVisible 
          and set(v:bool) = _iterationVisible <- v 
              x.NotifyPropertyChanged <@[email protected]> 

を公開することができます

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

012 WPFによって処理することができ
  • この中間Iterationプロパティを経由せず、progressChangedイベントを公開するのF#で直接的な方法はあり、?それは、私たちが得ることができる最も宣言的なものか、常にどこかの州を保存しなければならないのでしょうか?

  • さらに、この「ステートマシン」バインドを行うための自然な方法がありますか?XAML

  • 答えて

    1

    私の知る限り、xamlのイベントを処理する方法はありません。したがって、イベントの変更をプロパティで公開することは、おそらくあなたができることです。

    xamlで "ステートマシンのバインド"を実現するには、進行状況をサイズとして公開してから、プログレスバーの幅をそのプロパティにバインドします。その例については、hereを参照してください。

    1

    私はF#の初心者ですが、これを正しく行うように見えます。

    通常、WpfはMVVMパターンで使用されるため、コマンドプロパティにボタンを配線し、プログレスバーをintプロパティに配線するのは正しいです。あなたのコマンドは、進行状況の値を変更させ、バインディングが残りの部分を処理するようにします。

    xamlのイベントを処理するにはコードビハインドが必要ですが、これはUIを向上させるためだけのものです。それは確かに他のオブジェクトと対話するべきではありません。つまり、イベントハンドラはありません。

    これは、イベントをコマンドにバインドするために使用できるコマンドビヘイビアーをもたらします。 msdnを参照してください。

    これは何らかの形で役立ちます。