如何将图表的轴绑定到List()的特定索引?

时间:2013-07-31 20:09:14

标签: c# .net wpf xaml wpftoolkit

我尝试使用WPF工具包创建图表,其中Y轴正在通过List()中的值进行更新。我尝试通过特定索引访问该值。目前,绑定到List()而不是int的索引会创建一个"没有合适的轴可用于绘制相关值。"异常。

这是我到目前为止所做的,请注意我尝试让DependentValuePath访问索引:

<Charting:LineSeries VerticalAlignment="Stretch" 
                     HorizontalAlignment="Stretch" 
                     ItemsSource="{Binding Path=MemoryStats}" 
                     IndependentValuePath="Timestamp" 
                     DependentValuePath="ByteCount[0]"
                     Title="Data Points">

这是MemoryStats值在后面的代码中包含的内容:

public List<int> ByteCount { get; set; }
public DateTime Timestamp { get; set; }

当XAML中的LineSeries具有属性DependentValuePath="ByteCount"并且代码隐藏使用简单的int时,图表工作正常:

public int ByteCount { get; set; }
public DateTime Timestamp { get; set; }

如何将其绑定到List()而不是int的索引?

修改

我已经能够通过命名索引来从后面的代码中获取列表中的特定值,但是在创建图表时会动态生成多个LineSeries。我想将每个绑定到List<int>()的索引,我每隔一秒左右重新创建一次。

以下是MemoryStats用于更新UI的完整方法。它的工作原理是将所有LineSeries Y值更新为单个ByteCount int,因此目前所有行看起来都相同。

    public class MemorySample
    {
        public static MemorySample Generate(List<int> dataPoints)
        {

            return new MemorySample
            {
                ByteCount = dataPoints[0],
                Timestamp = DateTime.Now
            };
        }

        public int ByteCount { get; set; }
        public DateTime Timestamp { get; set; }
    }

当然,我希望所有LineSeries都不同。我想让图表的每个LineSeries的X轴为TimeStamp(因此它们都具有相同的TimeStamp),并且各种LineSeries的Y轴值由一个List()个整数,每个整数使用List()

的单独索引

我会尝试实现类型转换器,但我不完全确定何时/何地这样做。

编辑2

我按照我想要的方式工作!我找到了很多帮助from this S.O. question regarding using multiple series in a line chart.

似乎类型转换器也能正常工作,所以Shimrod已经回答了问题。然而,我最终做的是设置LineSeries&#39; ItemSource到索引,然后检索该索引内容的数据。

所以,这是LineSeries的样子:

        <Charting:LineSeries VerticalAlignment="Stretch" 
                            HorizontalAlignment="Stretch" 
                            ItemsSource="{Binding [0]}" 
                            IndependentValuePath="X" 
                            DependentValuePath="Y"
                            Title="Data Points">
        </Charting:LineSeries>

请注意ItemSource绑定中的索引。在后面的代码中,我将控件的DataContext设置为ObservableCollection,其中包含一个继承自&lt; IList&#39; (您可以使用任何执行此操作的对象),该对象包含包含属性XY属性的对象。

   public ObservableCollection<InheritsFromIList<ObjectWithXandYProperties>> VariableDataContextIsSetTo { get; set; }

访问ObservableCollection的特定索引将返回列表。然后,该列表中的项目显示在图表上。

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法是在您的课程中添加一个属性int的{​​{1}}值。

e.g。

List

或者你也可以创建一个转换器,它将列表作为绑定,索引作为参数,并返回所需的值。

例如(我还没试过)

int val { get { return ByteCount[0]; } }

修改

以下是使用转换器的步骤:

  1. 创建类(ElementOfListConverter),如前所示。
  2. 添加一个指向转换器位置的新xml命名空间。例如。 public class ElementOfListConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value is IList && parameter is int) { var lst = value as IList; int pos = (int)parameter; if (lst.Count >= pos) { return lst[pos]; } } return null; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }
  3. 在Window(或UserControl)的资源中,添加对转换器的引用,如下所示:

    xmlns:local="clr-namespace:WpfApplication2"
  4. 在绑定中,指定要使用的转换器(使用其键<Window.Resources> <local:ElementOfListConverter x:Key="ElemOfList" /> </Window.Resources>

  5. 此方法的专业版是您可以直接在xaml中指定元素的索引。您还可以使用MultiBindingMultiValueConverter将此值绑定到其他值。 (如果您需要更多信息,请参阅this question on S.O.