Как динамически изменить DataPointStyle на графике wpf из события dataGrid_SelectedCellsChanged - PullRequest
0 голосов
/ 11 марта 2011

Я использую WPFToolkit для создания линейной диаграммы с несколькими LineSeries (несколько цветов).У меня есть элемент управления DataGrid, где DataGrid.RowCount = LineSeriesCount.Сетка данных отображает соответствующие данные для каждой линии на диаграмме.

Мне нужно выделить (изменить ее цвет на черный) линию на диаграмме, когда я выбираю соответствующую сетку данных на dataGrid_SelectedCellsChanged.

iпопробовал ссылку ниже, но это не помогло: Динамическое изменение стиля в WPF

Так что var dpStyle = new Style () {BasedOn = originalStyle};не работает.

Я использую приведенный ниже код для создания необходимого стиля:

public Window1()
    {
        InitializeComponent();          
        dataGrid1.Width = mcChart.Width;
        HighlightedBlackDataPointStyle = new Style(typeof(LineDataPoint));
        HighlightedBlackDataPointStyle.Setters.Add(new Setter(LineDataPoint.VisibilityProperty, Visibility.Hidden));            HighlightedBlackDataPointStyle.Setters.Add(new Setter(LineDataPoint.OpacityProperty, 0.01));            HighlightedBlackDataPointStyle.Setters.Add(new Setter(LineDataPoint.BackgroundProperty, new SolidColorBrush(Colors.Black)));
        this.Resources.Add("HighlightedBlackDataPointStyle", HighlightedBlackDataPointStyle);


    } 

Вот как я пытаюсь установить вышеуказанный стиль:

private void dataGrid1_SelectedCellsChanged(object sender, System.Windows.Controls.SelectedCellsChangedEventArgs e)
    {
        if (dataGrid1.SelectedIndex >= 0)
        {
            mcChart.Series.OfType<LineSeries>().ElementAt(dataGrid1.SelectedIndex).DataPointStyle = HighlightedBlackDataPointStyle;
            mcChart.Series.OfType<LineSeries>().ElementAt(dataGrid1.SelectedIndex).Refresh();
            mcChart.Series.OfType<LineSeries>().ElementAt(dataGrid1.SelectedIndex).UpdateLayout();
            mcChart.UpdateLayout();
        }
    } 

Это меняет цвет легенды на черный, но не на предполагаемую линию.

Я добавил все lineSeries в коде C #, установив Sytle при его создании.У меня нет определения стиля в XAML.Поэтому не уверен, смогу ли я использовать привязку DynamicResource из XAML.

Пожалуйста, дайте мне знать, как я могу добиться этого с помощью кода C #, а не XAML.

1 Ответ

0 голосов
/ 16 марта 2011

Вопрос довольно устарел, но я отвечу, потому что, возможно, у кого-то есть такая же проблема.

На самом деле это не так сложно, как кажется.Чтобы изменить цвет линии, просто используйте свойство Background LineSeries:

    private Brush previousColor;

    private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.RemovedItems != null && e.RemovedItems.Count > 0)
        {
            var removedItem = (ItemViewModel)e.RemovedItems[0];
            var line = chart.Series.OfType<LineSeries>().FirstOrDefault(ls => (int)ls.Tag == removedItem.Id);

            line.Background = previousColor;
        }
        if (e.AddedItems != null && e.AddedItems.Count > 0)
        {
            var selectedItem = (ItemViewModel)e.AddedItems[0];
            var line = chart.Series.OfType<LineSeries>().FirstOrDefault(ls => (int)ls.Tag == selectedItem.Id);

            previousColor = line.Background;
            line.Background = Brushes.Black;
        }
    }

Я использую свойство Tag, потому что индекс строки элемента можно изменить путем сортировки, тогда как Id всегдато же самое.

<charting:Chart x:Name="chart" DataContext="{Binding Items}" Grid.Row="1" Grid.Column="1">
        <charting:Chart.Series>
            <charting:LineSeries DataContext="{Binding [0]}" ItemsSource="{Binding ChartItems}" Title="{Binding Title}" Tag="{Binding Id}" 
                                 IndependentValuePath="XValue"  DependentValuePath="YValue" />

Я не опубликовал код ItemViewModel и xaml DataGrid, но я думаю, что основная идея ясна.

...