LiveCharts - DependencyProperty для Fill / Stroke Binding не работает - PullRequest
0 голосов
/ 15 мая 2018

У меня проблема с DependencyProperty для повторно используемого элемента управления, который я создаю для построения однолинейной серии с использованием LiveCharts. Проблема в том, что у меня есть 3 свойства зависимости, которые я хочу настроить; один - это значения для диаграммы, один - цвет заливки ряда, а последний - цвет обводки серии. Вот мой XAML:

<UserControl x:Class="DataAnalyzer.Controls.QuickPlotSingleLogFile2"
         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:DataAnalyzer.Controls"
         xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800"
         x:Name="parentControl">
<Grid x:Name="Grid_Container">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <lvc:CartesianChart Name="ChartFile" 
                        Grid.Row="0" 
                        LegendLocation="None" 
                        DisableAnimations="true" 
                        Hoverable="true" 
                        DataTooltip="{x:Null}" 
                        Margin="10" 
                        BorderBrush="Black">
        <lvc:CartesianChart.Series>
            <lvc:LineSeries x:Name="LineSeries1" 
                            PointGeometry="{x:Null}" 
                            Values="{Binding PlotValues}" 
                            Fill="{Binding FillBrush}" 
                            Stroke="{Binding StrokeBrush}" 
                            AreaLimit="0"></lvc:LineSeries>
        </lvc:CartesianChart.Series>
        <lvc:CartesianChart.AxisX>
            <lvc:Axis Labels=" " Title="Time">
                <lvc:Axis.Separator>
                    <lvc:Separator IsEnabled="False"></lvc:Separator>
                </lvc:Axis.Separator>
            </lvc:Axis>
        </lvc:CartesianChart.AxisX>
    </lvc:CartesianChart>
</Grid>

А вот код:

public partial class QuickPlotSingleLogFile2 : UserControl, INotifyPropertyChanged
{

    // Formatter for the datetime in the x-axis for any series
    public Func<double, string> DateTimeSeriesFormatter { get; set; }

    #region PlotValues DP

    public ChartValues<double> PlotValues {
        get { return (ChartValues<double>)GetValue(PlotValuesProperty); }
        set { SetValue(PlotValuesProperty, value); }
        }

    public static readonly DependencyProperty PlotValuesProperty = DependencyProperty.Register("PlotValues", typeof(ChartValues<double>), typeof(QuickPlotSingleLogFile2));

    #endregion

    #region FillBrush DP

    public Brush FillBrush
    {
        get { return (Brush)GetValue(FillBrushProperty); }
        set { SetValue(FillBrushProperty, value); }
    }

    public static readonly DependencyProperty FillBrushProperty = DependencyProperty.Register("FillBrush", typeof(Brush), typeof(QuickPlotSingleLogFile2), new PropertyMetadata());

    #endregion

    #region StrokeBrush DP

    public Brush StrokeBrush
    {
        get { return (Brush)GetValue(StrokeBrushProperty); }
        set { SetValue(StrokeBrushProperty, value); }
    }

    public static readonly DependencyProperty StrokeBrushProperty = DependencyProperty.Register("StrokeBrush", typeof(Brush), typeof(QuickPlotSingleLogFile2), new PropertyMetadata(null));

    #endregion

    public QuickPlotSingleLogFile2()
    {
        InitializeComponent();

        Grid_Container.DataContext = this;

    }

    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;

     protected void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;

        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
    #endregion

}

Мой вопрос: есть ли что-то еще, что мне нужно сделать для свойства, такого как "Fill"? Настроенный мною PlotValuesProperty работает точно так же, как и ожидалось - с привязкой проблем нет. Но я не могу заставить привязку работать для кисти заливки или обводки - она ​​каким-то образом теряется, и на диаграммах в реальном времени отображаются значения по умолчанию для заливки и обводки. Этот пользовательский элемент управления используется в родительском окне, и контекст данных в конечном итоге становится окном, что я и хочу. Я проверил отладчик, чтобы убедиться, что контекст данных установлен правильно, и, похоже, он работает, так как значения для диаграммы установлены правильно. Но что-то странное происходит с заливкой / ударом.

1 Ответ

0 голосов
/ 15 мая 2018

Я разобрался с ответом на этот вопрос.Я точно не понимаю, почему, но причина, по которой я не видел работающую привязку, заключается в том, что я не инициализировал свойства fill / stroke в моем главном окне.

Для справки, мой оригинальный код для основногоокно (усеченное, чтобы показать только соответствующую привязку для этого пользовательского элемента управления) было:

public partial class MainWindow
{
    #region Binding QuickPlotValues
    private ChartValues<double> _quickPlotSingleLogFileValues;
    public ChartValues<double> QuickPlotSingleLogFileValues
    {
        get
        {
            return _quickPlotSingleLogFileValues;
        }
        set
        {
            _quickPlotSingleLogFileValues = value;
            OnPropertyChanged("QuickPlotSingleLogFileValues");
        }
    }
    #endregion

    #region Binding QuickPlotFill
    private Brush _quickPlotFill;
    public Brush QuickPlotFill
    {
        get
        {
            return _quickPlotFill;
        }
        set
        {
            _quickPlotFill = value;
            OnPropertyChanged("QuickPlotFill");
        }
    }
    #endregion

    #region Binding QuickPlotStroke
    private Brush _quickPlotStroke;
    public Brush QuickPlotStroke
    {
        get
        {
            return _quickPlotStroke;
        }
        set
        {
            _quickPlotStroke = value;
            OnPropertyChanged("QuickPlotStroke");
        }
    }
    #endregion
}

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

<vm:QuickPlotSingleLogFile2 x:Name="PreviewPlotSingleLogFile2"
                                            Grid.Row="1"
                                            Margin="20"
                                            VerticalAlignment="Stretch"
                                            MinHeight="250"
                                            PlotValues="{Binding QuickPlotSingleLogFileValues}"
                                            FillBrush="{Binding QuickPlotFill}"
                                            StrokeBrush="{Binding QuickPlotStroke}"/>

Я обновил код основного окна доследующее (инициализация цвета заливки / обводки):

 #region Binding QuickPlotFill
    private Brush _quickPlotFill = new SolidColorBrush(Colors.Red);
    public Brush QuickPlotFill
    {
        get
        {
            return _quickPlotFill;
        }
        set
        {
            _quickPlotFill = value;
            OnPropertyChanged("QuickPlotFill");
        }
    }
    #endregion

    #region Binding QuickPlotStroke
    private Brush _quickPlotStroke = new SolidColorBrush(Colors.Green);
    public Brush QuickPlotStroke
    {
        get
        {
            return _quickPlotStroke;
        }
        set
        {
            _quickPlotStroke = value;
            OnPropertyChanged("QuickPlotStroke");
        }
    }
    #endregion

И вдруг все заработало.

...