0

我有一个使用 Telerik 图表的 Silverlight 应用程序。

在我看来,我有 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 调用有关?

4

1 回答 1

2

我看到您上面提供的代码存在两个潜在问题:

  1. 您没有将图表的 ItemsSource 绑定到您的视图模型对象。

  2. 根据处理异步回调的线程,可能存在跨线程问题。

当您在方法中分配MyChartData属性时GetChartDataCallback,将触发 PropertyChanged 事件。但是因为你没有在视图层中绑定任何东西,所以没有任何东西在监听这个事件。您的图表不会获得任何新数据。

要使用绑定,您可以替换该行

Chart1.ItemsSource = viewModel.MyChartData;

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

或者,您可以在 XAML 中设置绑定。

至于跨线程问题,我没有任何用于测试您的异步服务的代码。相反,我敲开了一个简单的测试应用程序,它试图在一个单独的线程中更新视图模型数据。组成一些数据后,此应用程序尝试将这些数据分配给一个类似于您上面的视图模型属性,使用该行

ChartData = data;

当我运行这个应用程序时,这一行导致了一个 UnauthorizedAccessException,它提到了一个无效的跨线程访问。

我将上面的行替换为

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

此更改消除了异常,并允许我在图表中查看(编造的)数据。using System.Windows;(如果您还没有一行,则需要添加一行。)

于 2012-03-15T22:24:04.943 回答