2012-05-29 68 views
0

我目前正在編寫一個包含費率的WPF進度條(請參閱Windows 8 - Fancy Progress Bars API?)。WPF綁定和歷史值

下面的屏幕截圖顯示了我到目前爲止(左)和作爲我學習練習(右)的一部分代碼做得很糟糕。我現在正在嘗試將代碼版本轉換爲儘可能多地使用XAML。

enter image description here

我已經得到了大部分的存在方式,通過創建一個名爲RateBase新類,並以類似的方式來實現RangeBase它。然後我添加了一個新實例並提供了一個模板文件RangeGraph。我試圖儘可能地按照本書的要求來做,但我不知道如何解決最後階段。

我現在想要添加一個圖表,該圖表顯示了隨着進度的進展歷史性變化的速率。我把'Rate'作爲一個可以綁定的值,但是我相信我需要一個包含我的歷史費率值的Double []。我的問題是應該把它放在哪裏(我不是真的想污染RateBase),我怎麼從我的模板綁定到它(我不相信我可以綁定到RangeGraph.cs,如果我添加屬性或上午我錯了嗎?)

回答

1

你是對的,你需要歷史數據。在我看來,只要綁定的依賴項屬性Rate發生變化,您應該將舊值移動到在圖形控件本身(具有DP的相同位置)上定義的IEnumerable中,並使用該值繪製線條。我個人會創建一個名爲MyControlData的類並將其添加到控件的一個實例。

您可能還想添加Timer,並在當Elapses時將當前比率移動到IEnumerable,因此相同比率的較長條紋將顯示爲多條。取決於你如何確定進度。您可能會遇到以下兩難處境:在大多數情況下,Rate的變化間隔與Percentage不同 - 您的船漂浮着什麼?

將歷史記錄保存在控件的作用域中會使您的應用程序不知道您的速率的歷史記錄,但可以讓您的控件根據需要進行顯示。

要在UserControl中使用DataBinding,請編輯Control.xaml中的<UserControl x:Name="myControl">節點並添加一個名稱,如下所示。無論你想要綁定,請參閱ElementName=myControl。請注意,如果你想實現這一點,你必須在控件(或MyControlData)上實現INotifyPropertyChanged - 或者,這是可取的,直接將它作爲一個依賴項屬性來實現。

順便說一句,如果你不知道如何實現你打算看看ItemsControl。我認爲您想要做的事情可以通過使用ItemsControlItemsTemplate這樣簡單的方法輕鬆實現,其中ItemsSource是您的歷史數據,而ItemTemplate描述了您的當前比例與MaxRate的比較。 MaxRate是您可以從DependencyProperty Rate的更改處理程序中設置的另一個屬性。

+0

感謝您的回答,我不打算將歷史價值放在'RateBase'上,但我可能會根據您的建議改變我的想法。你指出了一個關於更新或進度和利率可能是獨立的非常有效的觀點,我需要考慮的是,但是價格變化時的邊界值的X值與進度有關,所以它可能不是問題。我會看看ItemsControl的東西。我設法使用RateGraph.cs中的ObservableCollection來實現一個實現(模板後面的代碼),但不確定這是最好的方法。 – Ian