2012-03-15 30 views
0

我有一個使用telerik圖表的silverlight應用程序。如何正確使用異步服務使用silverlight和telerik圖表處理數據

在我看來,我有xaml中的圖表。在視圖背後的代碼,我有這樣的事情:

public partial class MyView : UserControl 
{ 
    private MyViewModel viewModel; 

    public MyView() 
    { 
     InitializeComponent(); 
     CreateChartMappings(); // Creates the SeriesMappings for my chart 
     viewModel = new MyViewModel(); 
     Chart1.ItemsSource = viewModel.MyChartData; 

     DataContext = viewModel; 
     Resources.Add("ViewModel", viewModel); 

    } 
} 

在我的ViewModel我有這樣的:

public class MyViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<ChartData> myChartData; 
    public ObservableCollection<ChartData> MyChartData 
    { 
     get { return myChartData; } 
     set { myChartData= value; OnPropertyChanged("MyChartData"); } 
    } 

    public MyViewModel() 
    { 
     MyWebServiceClient service = MyWebServiceClient.CreateInstance(); 

     service.GetChartDataCompleted += 
      new EventHandler<GetChartDataCompletedEventArgs>(GetChartDataCallback); 

     service.GetChartDataAsync(); 
    } 


    private void GetChartDataCallback(object sender, GetChartDataCompletedEventArgs e) 
    { 
     if (e.Error == null) 
     { 
      MyChartData = e.Result; 
     } 
    } 
} 

我知道肯定GetChartData將返回正確輸入,可用於數據對於圖表,看到GetChartDataCallback確實會在e.Result中返回結果,但我不知道如何將這些數據加載到我的圖表中。

如果我做了類似Chart1.ItemsSource = viewModel.MyChartData;在我確定服務返回數據之後,數據會加載到圖表中。例如,如果我在視圖中創建了一個調用該代碼行的按鈕,它將從服務中將數據加載到圖表中。

此外,如果我用正常的方法調用取代asyc調用,它也可以正常工作,所以我的問題可能與不正確處理asyc調用有關嗎?

回答

2

有我與您在上面提供的代碼中看到兩個潛在的問題:

  1. 你不是圖表的的ItemsSource綁定到您的視圖模型對象。

  2. 根據哪個線程處理異步回調,可能存在跨線程問題。

當分配給MyChartData財產在你GetChartDataCallback方法,PropertyChanged事件中被解僱。但是因爲你沒有在視圖層中綁定任何東西,所以沒有任何東西在聽這個事件。你的圖表不會得到任何新的數據。

要使用綁定,您可以用

Binding binding = new Binding("MyChartData") { Source = viewModel }; 
Chart1.SetBinding(RadChart.ItemsSourceProperty, binding); 

更換線

Chart1.ItemsSource = viewModel.MyChartData; 

或者,您可以設置在XAML綁定。

至於跨線程問題,我沒有任何異步服務的代碼,比如你的測試對象。相反,我敲了一個簡單的測試應用程序,試圖在單獨的線程中更新視圖模型數據。構成一些數據後,該應用程序試圖上述多分配這個數據到一個視圖模型屬性等你的,使用行

ChartData = data; 

當我運行該應用程序,這條線中導致UnauthorizedAccessException,其中提到了無效跨線程訪問。

我取代以上

Deployment.Current.Dispatcher.BeginInvoke(() => { ChartData = data; }); 

這種變化擺脫了異常的線,讓我看到了(虛構的)數據在圖表中。(如果您還沒有,您需要添加一行using System.Windows;)。

+0

您對綁定正確無誤。謝謝。我確實曾經在XAML中使用過它,但拼錯了綁定名稱。我沒有遇到任何關於該服務的問題,但是如果我願意,我會記住你的答案。 – dtc 2012-03-15 23:46:36