Silverlight 3 Chart Usercontrol,需要更改/设置图例标题

时间:2010-03-06 04:09:04

标签: c# silverlight data-binding xaml charts

我在用户控件中有一个图表。由于我想在应用程序中使用多个图表,我需要为每个用户控件实例设置一系列标题。它到目前为止工作正常,但我无法将变量(例如seriesTitle)绑定到用户控件xaml中的目标。

请参阅以下代码:

使用MainPage.xaml中的用户控件:

<local:ColumnInputChart 
  Name="Chart1" 
  seriesTitle="Diuretics"
  seriesItemId="1"
  getServiceUrl="/Service/MedIntake/1"
  postServiceUrl="/Service/MedIntake/"
  />

例如seriesTitle是用户控件中的public var。

public partial class ColumnInputChart : UserControl
{
    public String seriesItemId { get; set; }
    public String getServiceUrl { get; set; }
    public String postServiceUrl { get; set; }
    public String seriesTitle { get; set; }

在ColumnInputChart.xaml中我试图将seriesTitle绑定到一个系列的Title,这不起作用。传奇有一个空头衔。我是否需要以编程方式设置标题?

<chartingToolkit:AreaSeries ItemsSource="{Binding}" 
   DependentValuePath="Dpd"
   IndependentValuePath="Date" 
   Title="{Binding seriesTitle, Mode=TwoWay}" />

我也意识到,在构建用户控件期间,我的用户控件在MainPage.xaml中设置的自定义公共变量尚未设置。但是,一旦Page_Loaded事件被触发,它们就可用了。

请参阅代码中的代码和注释,以澄清我的意思:

    public String seriesItemId { get; set; }
    public String getServiceUrl { get; set; }
    public String postServiceUrl { get; set; }
    public String seriesTitle { get; set; }

    public ColumnInputChart()
    {
        // seriesItemId and so on are null here.

        InitializeComponent();
        Loaded += new  RoutedEventHandler(Page_Loaded);

        // and null here.
    }

    void Page_Loaded(object sender, RoutedEventArgs e) {

        // seriesItemId, seriesTitle ... have now the 
        // value form MainPage.xaml
    }

这是我的用户控件的图表代码:

    <chartingToolkit:Chart Height="160" x:Name="Chart" BorderThickness="0" Style="{StaticResource MyChartStyle}">
        <chartingToolkit:Chart.Axes>
            <chartingToolkit:DateTimeAxis Orientation="X">
                <chartingToolkit:DateTimeAxis.AxisLabelStyle>
                    <Style TargetType="chartingToolkit:DateTimeAxisLabel">
                        <Setter Property="StringFormat" Value="{}{0:d/M/yyyy}"/>
                    </Style>
                </chartingToolkit:DateTimeAxis.AxisLabelStyle>
            </chartingToolkit:DateTimeAxis>
            <chartingToolkit:LinearAxis Orientation="Y" Location="Left" Title="Intake per day" ShowGridLines="True" />
        </chartingToolkit:Chart.Axes>
        <chartingToolkit:AreaSeries x:Name="MySeries2" ItemsSource="{Binding}" 
            DependentValuePath="Dpd"
            IndependentValuePath="Date" Title="{Binding seriesTitle, Mode=TwoWay}" />
        <chartingToolkit:ColumnSeries ItemsSource="{Binding}"
           DependentValuePath="Dpd"
           IndependentValuePath="Date" 
           IsSelectionEnabled="True" 
           Title="Missing Values"
           SelectionChanged="ColumnSeries_SelectionChanged" />
    </chartingToolkit:Chart>

我正在使用ObservableCollections作为图表的ItemSource。

        medIntakes = new ObservableCollection<MedIntakeObj>();
        medIntakeBars = new ObservableCollection<MedIntakeObj>();

        ((AreaSeries)Chart.Series[0]).ItemsSource = medIntakes;
        ((ColumnSeries)Chart.Series[1]).ItemsSource = medIntakeBars;

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

这对我有用; - )

但我仍在寻找更好的解决方案。

void Page_Loaded(object sender, RoutedEventArgs e) {

    // seriesItemId, seriesTitle ... have now the 
    // value form MainPage.xaml

    ((AreaSeries)Chart.Series[0]).Title = seriesTitle;
}

答案 1 :(得分:0)

安东尼的评论对我有所帮助。 我为UserControl创建了一个ViewModel。

public class ChartViewModel
{
    public String seriesTitle { get; set; }
    public String axisTitle { get; set; }

    public int seriesId { get; set; }
    public String serviceUrl { get; set; }

    public String comboText { get; set; }
    public List<String> comboList { get; set; }

将ViewModel分配给DataContext

public ColumnInputChart(ChartViewModel vm, SimpleCallback cb)
{
    InitializeComponent();

    this.vm = vm;
    this.cbStartScroll = cb;
    this.Chart.DataContext = vm;

UserControl的xaml现在有点不同了,绑定工作

        < ... />
        <chartingToolkit:LinearAxis Orientation="Y" Location="Left" Title="{Binding axisTitle}" 
                                    ShowGridLines="True" Interval="1" />
    </chartingToolkit:Chart.Axes>
    <chartingToolkit:AreaSeries ItemsSource="{Binding values}" 
        DependentValuePath="Dpd"
        IndependentValuePath="Date"
        Title="{Binding seriesTitle}" />
    <chartingToolkit:ColumnSeries ItemsSource="{Binding bars}"
       DependentValuePath="Dpd"
       IndependentValuePath="Date" 
       IsSelectionEnabled="True" 
       Title="Missing Values"
       SelectionChanged="ColumnSeries_SelectionChanged" />
</chartingToolkit:Chart>

现在我想知道将ObservableCollections集成到ViewModel中是否是一个好的设计决策。无论如何我可以为它们分配ItemSource,它们与UserControl非常相关,所以我想将它们保存在UserControl中是一个不错的选择。 请随时评论。