2013-02-24 85 views
0

我是MVVM的新手。目前我所有的代码都是以链接到XAML的.cs文件编写的。我想切换到MVVM,但遇到困难。我将尝试解释为什么:切换到MVVM问题

我有很多不同的图表控件和输入数据,以.cs文件中指定的方式直接访问Chart对象并使用它的属性programaticaly为我的图表添加点。

例子:

foreach (var group in qcv.Groups) 
{ 
    AreaSeries areaSeries = new AreaSeries(); 
    areaSeries.CombineMode = Telerik.Charting.ChartSeriesCombineMode.Stack; 
    areaSeries.ValueBinding = new PropertyNameDataPointBinding("Rev"); 
    areaSeries.CategoryBinding = new PropertyNameDataPointBinding("Date"); 
    areaSeries.ItemsSource = group as IEnumerable; 
    RadChart1.Series.Add(areaSeries); 
} 

但只要我切换到MVVM RadChart1对象变得不可访问的视图模型文件。我怎样才能让它在ViewModel类中可见,或者你可以建议更好的方法,我怎样才能得到该对象,并为我的图表提供输入而无需更改我的代码?

我的XAML文件:

<UserControl x:Class="FrontEnd.RevenueChart" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:FrontEnd" 
      mc:Ignorable="d" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" HorizontalAlignment="Stretch" > 

    <UserControl.DataContext> 
     <local:RevenueChartViewModel/> 
    </UserControl.DataContext> 
    <Grid> 

     <telerik:RadCartesianChart HorizontalAlignment="Stretch" x:Name="RadChart1" Palette="Metro" Zoom="10,1"> 

      <telerik:RadCartesianChart.HorizontalAxis> 
       <telerik:CategoricalAxis/> 
      </telerik:RadCartesianChart.HorizontalAxis> 

      <telerik:RadCartesianChart.VerticalAxis> 
       <telerik:LinearAxis/> 
      </telerik:RadCartesianChart.VerticalAxis> 

      <telerik:RadCartesianChart.Behaviors> 
       <telerik:ChartPanAndZoomBehavior ZoomMode="Both"> 
       </telerik:ChartPanAndZoomBehavior> 
      </telerik:RadCartesianChart.Behaviors> 
     </telerik:RadCartesianChart> 
    </Grid> 
</UserControl> 
+0

嗨!我现在无法整合一个例子,但请看看这里:http://www.telerik.com/help/silverlight/radchart-how-to-mvvm-support.html,这会有帮助吗?让我知道这是否适合你! MVVM是def。要走的路 – 2013-02-24 02:02:03

+0

虹膜,谢谢你的回答。我现在正在研究这个例子,我会试着弄清楚那里发生了什么。谢谢! – 2013-02-24 02:54:28

回答

0

访问从视图模型视图控件是一个很大的禁忌在MVVM土地。你必须反思你的想法:而不是添加东西Series,绑定Series东西。使用SeriesMapping s获取图表控件,将您的组转换为系列。这里有一些非正式的代码可以帮助你入门:

<telerik:RadCartesianChart HorizontalAlignment="Stretch" 
    Palette="Metro" Zoom="10,1" 
    Series="{Binding Groups}"><!-- <=== this is the important part --> 

    <telerik:RadChart.SeriesMappings> 
    <telerikCharting:SeriesMapping LegendLabel="Product Sales"> 
     <telerikCharting:SeriesMapping.SeriesDefinition> 
     <telerikCharting:AreaSeriesDefinition/> 
     </telerikCharting:SeriesMapping.SeriesDefinition> 
     <telerikCharting:SeriesMapping.ItemMappings> 
     <telerikCharting:ItemMapping DataPointMember="XCategory" FieldName="Date"/> 
     <telerikCharting:ItemMapping DataPointMember="YValue" FieldName="Rev"/> 
     </telerikCharting:SeriesMapping.ItemMappings> 
    </telerikCharting:SeriesMapping> 
    </telerik:RadChart.SeriesMappings> 
    ... 
+0

谢谢安东。听起来不错,并且有意义的是,你对MVVM中的访问控制位置没有任何限制。但不幸的是,我是UI设计的新手,你能否提供一些例子来说明你如何绑定并动态添加系列图表?再次感谢,安东。 – 2013-02-24 02:30:57

+0

您不会将系列添加到MVVM中的图表,您可以告诉它从哪里获取系列数据以及如何呈现它。这就是我的示例代码片段所做的。如果你是新手,我不能做比问题中列出的教程更好的http://stackoverflow.com/questions/1405739/mvvm-tutorial-from-start-to-finish。 – 2013-02-24 10:48:28