4

我正在尝试使用 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; }

如何让它绑定到 aList()而不是a 的索引int

编辑

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

这是MemoryStats用于更新 UI 的完整方法。它通过将所有LineSeriesY 值更新为单个 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图表TimeStamp的XLineSeriesList()List()

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

编辑 2

我让它按照我想要的方式工作!我从这个 SO question 中找到了很多关于在折线图中使用多个系列的帮助。

看起来类型转换器也可以工作,所以 Shimrod 已经回答了这个问题。然而,我最终做的是将 LineSeries' 绑定ItemSource到一个索引,然后检索该索引内容的数据。

所以,这就是它的LineSeries样子:

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

ItemSource注意绑定中的索引。在后面的代码中,我将DataContext控件的 设置为ObservableCollection,它包含一个从“IList”继承的对象(您可以使用任何这样做的对象),并且该对象包含包含属性XY属性的对象。

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

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

4

1 回答 1

1

我认为最简单的方法是在您的类中添加一个属性,该属性将intList.

例如

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

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

例如(我没有试过这个)

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();
    }
}

编辑

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

  1. 创建类 (ElementOfListConverter),如前所示。
  2. 添加一个指向转换器位置的新 xml 命名空间。例如 xmlns:local="clr-namespace:WpfApplication2"
  3. 在 Window(或 UserControl)的资源中,添加对转换器的引用,如下所示:

    <Window.Resources>
        <local:ElementOfListConverter x:Key="ElemOfList" />
    </Window.Resources>
    
  4. 在您的绑定中,指定要使用的转换器(使用其密钥{Binding YourElement, Converter={StaticResource ElemOfList}, ConverterParameter=0}

此方法的优点是您可以直接在 xaml 中指定元素的索引。MultiBinding您还可以使用 a和 a将此值绑定到其他值MultiValueConverter。(如果您需要更多信息,请参阅关于 SO 的这个问题。

于 2013-07-31T20:19:17.027 回答