2013-03-25 33 views
8

將按鈕的命令綁定到動作後,我調用一個暴露進度事件的對象。聲明性進度條綁定

event System.EventHandler<ProgressChangedEventArgs> ProgressChanged 

我想顯示在我的XAML中的最佳途徑。


一種方法可以在我的VM公開兩個綁定字段

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]> 

又在哪裏我叫要執行的操作,我只想更新屬性

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

回答

1

據我所知,沒有辦法在xaml中處理事件,因此通過屬性暴露事件更改可能是您可以做的最好的事情。

要在xaml中實現「狀態機綁定」,您可以將進度作爲大小公開,然後將進度欄的寬度綁定到該屬性。有關此示例,請參閱here

1

雖然我是F#的新手,但您看起來確實是這樣做的。

Wpf通常與MVVM模式一起使用,因此將按鈕連接到命令屬性並將進度條連接到int屬性是正確的。然後,您的命令會執行一些操作,以使進度值發生更改,綁定會處理剩下的事情。

在xaml中處理事件需要隱藏代碼,我個人不介意它是否僅用於增強UI。它當然不應該與其他對象交互。這意味着沒有事件處理程序。

這會將事件引入可用於將控件事件綁定到命令的命令行爲。見msdn

希望這有助於某種方式。

相關問題