2012-03-15 8 views
0

私はtelerikチャートを使用してSilverlightアプリケーションを使用しています。SilverlightおよびTelerikチャートで非同期サービスを使用してデータを正しく処理する方法

私の見解では、xamlにグラフがあります。

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を正しく使用することができ、データを入力した返すことを確実に知る:私はこれを持って私のViewModelで

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); 

    } 
} 

:ビューの背後にあるコードでは、私はこのようなものを持っていますグラフの場合、GetChartDataCallbackはe.Resultで結果を返しますが、そのデータをグラフにロードする方法はわかりません。

私がChart1.ItemsSource = viewModel.MyChartDataのようなことをすれば、サービスがデータを返すと確信した後、データはチャートに正常に読み込まれます。たとえば、ビューの中にその行のコードを呼び出すボタンを作成すると、サービスからチャートにデータがロードされます。

また、通常のメソッド呼び出しでasyc呼び出しを置き換えても問題なく動作するため、問題はasyc呼び出しを正しく処理できないことがありますか?

答えて

2

私はあなたが上に提示したコードを見る二つの潜在的な問題があります。

  1. あなたはあなたのビューモデルオブジェクトにチャートののItemsSourceを結合していないが。

  2. 非同期コールバックを処理するスレッドによってクロススレッドの問題が発生することがあります。

あなたGetChartDataCallback方法でMyChartDataプロパティに割り当てると、PropertyChangedイベントが解雇されています。しかし、あなたはそれにビュー層で何かを結びつけていないので、何もこのイベントを聞いていません。あなたのチャートは新しいデータを取得しません。

バインディングを使用するには、あなたが行に代わり

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

Chart1.ItemsSource = viewModel.MyChartData; 

を置き換えることができ、あなたは、XAMLでバインディングを設定することができます。

クロススレッドの問題については、私はテストするような非同期サービス用のコードがありません。代わりに、別のスレッドでビューモデルのデータを更新しようとする単純なテストアプリケーションをノックアップしました。いくつかのデータを構成すると、このアプリケーションは、私は、このアプリケーションを実行した場合は、この行が無効に言及UnauthorizedAccessExceptionを引き起こしたラインに

ChartData = data; 

を使用して、上記のあなたのような多くのビューモデルのプロパティに、このデータを割り当てようとしますクロススレッドアクセス。

私はこの変更は、例外を処分した

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

で上記の行を置き換え、グラフ内のデータを(作っアップ)を見るために私を可能にしました。(あなたがまだ持っていない場合はusing System.Windows;を追加する必要があります)

+0

あなたは正しいと思います。ありがとうございました。私はある時点でXAMLでそれを持っていましたが、バインディング名の誤植がありました。私はまだサービスに関する問題に遭遇していませんでしたが、もし私がそうしたらあなたの答えを念頭に置いています。 – dtc

関連する問題