Silverlight 3 Chart Usercontrol, необходимо изменить / установить заголовок легенды - PullRequest
1 голос
/ 06 марта 2010

У меня есть диаграмма в пользовательском элементе управления. Поскольку я хочу использовать несколько диаграмм в приложении, мне нужно установить такие вещи, как заголовок серии для каждого экземпляра пользовательского элемента управления. Пока все работает нормально, но я не могу связать переменную (например, seriesTitle) с целью в пользовательских элементах управления xaml.

Пожалуйста, смотрите следующий код:

Использование пользовательского элемента управления в MainPage.xaml так:

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

Где, например, seriesTitle - это публичная переменная в пользовательском элементе управления.

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 я пытаюсь привязать заголовок серии к заголовку серии, который не работает. Легенда имеет пустой заголовок. Нужно ли устанавливать заголовок программно?

<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 голосов
/ 10 марта 2010

Комментарии Энтони мне очень помогли. Я создал ViewModel для моего UserControl.

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;

xaml в UserControl теперь немного отличается, и привязка работает

        < ... />
        <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 - хороший выбор. Пожалуйста, не стесняйтесь комментировать это.

0 голосов
/ 06 марта 2010

Это работает для меня; -)

Но я все еще ищу лучшие решения.

void Page_Loaded(object sender, RoutedEventArgs e) {

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

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