【问题标题】:XAML List<LineSeries> binding to chart SeriesXAML List<LineSeries> 绑定到图表系列
【发布时间】:2014-10-13 14:02:43
【问题描述】:

我有带有工具包图表的 MVVM silverlight 应用程序。 在视图模型中,我创建了 ObservableCollection 属性:

    private ObservableCollection<LineSeries> _lines = new ObservableCollection<LineSeries>();
    public ObservableCollection<LineSeries> Lines
    {
        get { return _lines; }
        set
        {
            _lines = value;
            NotifyPropertyChanged("Lines");
        }
    }

然后在某些方法中,我用动态计数线填充这个集合:

            List<SolidColorBrush> colors = BS2ColorSetHelper.GetSetColors();
            for (int i = 0; i < remainderData.Count; i++)
            {
                LineSeries line = (colors.ElementAtOrDefault(i) != null)
                    ? CreateNewLineSeriesWithColor(remainderData[i].DenominationName, remainderData[i].Coords, colors[i])
                    : CreateNewLineSeries(remainderData[i].DenominationName, remainderData[i].Coords);

                line.Name = remainderData[i].DenominationName;
                Lines.Add(line);
            }
            .........

现在我想将此 ObservableCollection 绑定到工具包图表系列。

    <toolkit:Chart Name="chart">
        <toolkit:Chart.Series>
            ????
        </toolkit:Chart.Series>
    </toolkit:Chart>

我试过了

Series="{Binding Path=Lines}"

但它不起作用。 Visual Studio 显示错误:“System.Windows.Data.Binding”类型的对象无法转换为“System.Collections.ObjectModel.Collection`1[System.Windows.Controls.DataVisuali‌​zation.Charting.ISeries]”类型。我认为这是因为 Series 不是依赖属性。

【问题讨论】:

  • 取决于控件Chart中使用的属性,您可能需要查看控件制造商的文档

标签: c# xaml mvvm charts toolkit


【解决方案1】:

好的,我们不能将 LineSeries 绑定到 Series,因为 Series 不是 Dependency 属性。 所以我们可以用这个依赖属性创建新的 UserControl:

public class MultiChart : Chart
{
    public IEnumerable SeriesSource
    {
        get
        {
            return (IEnumerable)GetValue(SeriesSourceProperty);
        }
        set
        {
            SetValue(SeriesSourceProperty, value);
        }
    }

    public static readonly DependencyProperty SeriesSourceProperty = DependencyProperty.Register(
        name: "SeriesSource",
        propertyType: typeof(IEnumerable),
        ownerType: typeof(MultiChart),
        typeMetadata: new PropertyMetadata(
            defaultValue: default(IEnumerable),
            propertyChangedCallback: new PropertyChangedCallback(OnSeriesSourceChanged)
        )
    );

    private static void OnSeriesSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        IEnumerable newValue = (IEnumerable)e.NewValue;
        MultiChart source = (MultiChart)d;

        source.Series.Clear();

        foreach (LineSeries item in newValue)
        {
            source.Series.Add(item);
        }
    }
}

然后我们只需将 LineSeries 绑定到新创建的属性:

    <common:MultiChart Name="chart"
                       Title="{Binding Path=Title}"
                       SeriesSource="{Binding Path=Lines}" />

视图模型将是:

public class ChartDenominationViewModel : ViewModel
{
    private string _title;

    public string Title
    {
        get { return _title; }
        set
        {
            _title = value;
            NotifyPropertyChanged("Title");
        }
    }

    private ObservableCollection<LineSeries> _lines = new ObservableCollection<LineSeries>();

    public ObservableCollection<LineSeries> Lines
    {
        get { return _lines; }
        set
        {
            _lines = value;
            NotifyPropertyChanged("Lines");
        }
    }
}

【讨论】:

    【解决方案2】:

    我不完全了解控件Chart 的相关信息,建议您查看控件发起者提供的文档以找出可绑定属性的名称。

    但根据您发布的内容,我的猜测是尝试:

    <toolkit:Chart Name="chart" Series={Binding Lines}/>
    

    猜测您的 Datacontext 已准备就绪。表示页面的数据上下文设置为您的视图模型

    【讨论】:

    • 我试过了,还是不行。 Visual Studio 显示错误:“System.Windows.Data.Binding”类型的对象无法转换为“System.Collections.ObjectModel.Collection`1[System.Windows.Controls.DataVisualization.Charting.ISeries]”类型。我认为这是因为 Series 不是依赖属性。
    • 您必须阅读您正在使用的toolkit 的文档,以找出要绑定到的依赖对象的名称
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多