"没有合适的轴可用于绘制相关值"使用MVVM和多个词典

时间:2015-10-13 11:22:34

标签: c# wpf mvvm charts wpftoolkit

我正在尝试使用图表工具包创建一个散点图系列,其中点的颜色由这些坐标处的条目数定义。基本上,我有一个带有Count(int)属性的GraphPointViewModel类,以及一个可以正常工作的画笔Color属性。

在定义散点图系列的ViewModel中,我有以下属性:

Red

这个ObservableDictionary只是将INotifyPropertyChanged方法添加到Dictionary类中,您会注意到Dictionary有另一个Dictionary。原因是基本词典的键是X轴值,而子词典的键是Y轴值。然后使用GraphPointViewModel定义系列的样式(即根据要求为点颜色)。

这个系列的填充被证明可以正常工作。问题来自与Y轴的绑定。

我的图表来自WPF图表工具包(System.Windows.Controls.DataVisualization),并在XAML中定义为:

Red

当我运行我的应用程序时,我收到错误"没有合适的轴可用于绘制相关值"即使没有添加数据。我尝试将DependentValuePath更改为Key,但这只是使用与X轴相同的Key。如何绑定这样的字典以达到我需要的效果?

更新 被要求发布ViewModel课程(虽然我不认为他们会帮助),这里是GraphPointViewModel:

Blue

这里是负责整理图表数据的ViewModel:

UPDATE Color_Table
SET Color = "TempRed"
WHERE Color = "Blue";

通过MQTT接收数据,然后使用Broker发布,因此ViewModel已直接订阅。

1 个答案:

答案 0 :(得分:0)

我通过删除两个词典来解决这个问题。我现在有一个EventDataPointsViewModel类:

public void updateToolbar(boolean show)
{
    if(getSupportActionBar() != null) {
        if(show) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        } else {
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        }
    }
}

现在数据

public class EventDataPointsViewModel : Mvvm.ViewModel
{

    private int _phaseAngle;

    public int PhaseAngle
    {
        get { return _phaseAngle; }
        set { SetPropertyAndNotify(ref _phaseAngle, value); }
    }

    private int _amplitude;

    public int Amplitude
    {
        get { return _amplitude; }
        set { SetPropertyAndNotify(ref _amplitude, value); }
    }

    private int _count;

    public int Count
    {
        get { return _count; }
        set { SetPropertyAndNotify(ref _count, value, new[] { "Colour" }); }
    }

    public Brush Colour
    {
        get
        {
            return Count >= 5 ?
                Brushes.Black :
                Brushes.Gray;
        }
    }
}

AddDataPoint方法是

public ObservableCollection<EventDataPointsViewModel> Data { get; set; }

图表的XAML是

    public void AddDataPoint(int angle, int amplitude)
    {
        try
        {
            var dataPoint = Data.FirstOrDefault(d => d.PhaseAngle == angle && d.Amplitude == amplitude);
            if (dataPoint != null)
            {
                dataPoint.Count++;
            }
            else
            {
                Data.Add(new EventDataPointsViewModel { Amplitude = amplitude, PhaseAngle = angle, Count = 1 });
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }