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

У меня есть диаграмма в пользовательском элементе управления. Поскольку я хочу использовать несколько диаграмм в приложении, мне нужно установить такие вещи, как заголовок серии, для каждого экземпляра пользовательского элемента управления. Пока это работает нормально, но я не могу привязать переменную (например, 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 я пытаюсь связать серию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;

Спасибо за любую помощь!


person andreas    schedule 06.03.2010    source источник
comment
Какая версия инструментария у вас установлена. Свойство Title, не являющееся обязательным, было исправлено в более позднем выпуске (я думаю, 9 октября).   -  person AnthonyWJones    schedule 06.03.2010
comment
Что вы назначаете в качестве DataContext для диаграммы?   -  person AnthonyWJones    schedule 06.03.2010
comment
Насколько мне известно, у меня установлена ​​последняя версия инструментария. Это ноябрь 2009 года.   -  person andreas    schedule 06.03.2010
comment
Я использую два ряда данных на диаграмме прямо сейчас. Оба связаны с ObservableCollection. Получение содержимого из бэкэнда ASP.Net MVC с использованием JSON получить запрос на отправку изменений обратно в бэкэнд с использованием обычных POST... Работает нормально. Я опубликую код.   -  person andreas    schedule 06.03.2010
comment
Итак, если я вас правильно понимаю, вы ничего не присваиваете свойству DataContext, поэтому неудивительно, что ваша привязка не работает.   -  person AnthonyWJones    schedule 06.03.2010


Ответы (2)


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

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

void Page_Loaded(object sender, RoutedEventArgs e) {

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

    ((AreaSeries)Chart.Series[0]).Title = seriesTitle;
}
person andreas    schedule 06.03.2010
comment
Но вы действительно не должны соглашаться на это. - person AnthonyWJones; 06.03.2010
comment
Это определенно не очень элегантно... Есть идеи получше? - person andreas; 06.03.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 — это хороший выбор. Пожалуйста, не стесняйтесь комментировать это.

person andreas    schedule 10.03.2010