好吧,我花了很長時間才找到問題的根源。
與別人所懷疑的不同,這根本不是多線程問題。
相反,這是您正在使用的DynamicDataDisplay
庫的問題。
有一個明確的理由,爲什麼你ListBox
對象上的ItemsSource
綁定工作,並且不會對Chart
(的Microsoft.Research.DynamicDataDisplay.Markers2.LineChart
型)工作:
Chart
既不具有可視化,也不是一個邏輯父。
您可以檢查這個,如果你將以下代碼插入到Button_Click
後他們設置一個斷點:
var visualParent = VisualTreeHelper.GetParent(Chart);
var logicalParent1 = Chart.Parent;
var logicalParent2 = LogicalTreeHelper.GetParent(Chart);
你可以看到,他們都是null
。
因此,您在LineChart.ItemsSourceProperty
上設置的Binding
與Path=ExampleCollection
找不到任何源值,並且只將null
分配給ItemsSource
。這是因爲DataContext
是從父級繼承的 - 但是當沒有父級時,則不會有任何DataContext
繼承。
而且因爲Chart
不是視覺或邏輯樹的一部分,所以沒有(容易)任何綁定到外部DataContext
甚至可以工作。
要驗證DataContext
是null
剛加入這一行前面的代碼:
var dataContext = Chart.DataContext;
現在有這三種可能的解決方案。
首先,您可以使用下面的代碼手動繼承Window
的DataContext
:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// Just add the following line.
Chart.DataContext = DataContext;
Chart.StrokeThickness = 3;
Chart.SetBinding(LineChart.ItemsSourceProperty, new Binding("ExampleCollection"));
// ...
}
如果您只需添加這一條線,你會看到你的其他的多線程代碼工作得很好,圖表用某種正弦波模式更新。
二,作爲另一種可能的解決方案,你可以諮詢爲DynamicDataDisplay
庫中的文件和檢查正確的和預期的方式來分配ItemsSource
到LineChart
使用數據綁定。
我試圖自己搜索文檔,甚至在兩個小時左右的時間內從該庫中調試了大量代碼,但是文檔幾乎不存在,代碼太複雜,無法在幾個小時內完全理解。我嘗試使用幾種工具(Visual Studio Live Visual Tree,Snoop,...)來顯示ChartPlotter
的可視化樹,但每次都得到StackOverflowException
,所以本庫中的某些內容是有缺陷的。
三,你可以使用一個Resource
作爲一種代理對象的創建「結合橋樑」的MainWindowViewModel
的同一個實例。
對於這個工作,你必須做這樣的事情在這裏建議:Data binding outside the visual tree. Data Context bridging
底線:所以,如果你只想把工作做好,我將設置DataContext
代碼如上所示。 (特別是如果DataContext
中的ViewModel
的實例永遠不會改變。)
如果您想要使用純數據綁定,那麼我可能會使用「綁定橋」或搜索另一個支持此方案的圖表庫。
可能的[ObservableCollection和線程]重複(http://stackoverflow.com/questions/2293246/observablecollection-and-threading) – dymanoid
如果你可以發佈'StackTrace'或至少是'Message'你的'InvalidOperationException'。 – haindl
@haindl我的不好,加了吧 –