我尝试使用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; (您可以使用任何执行此操作的对象),该对象包含包含属性X
和Y
属性的对象。
public ObservableCollection<InheritsFromIList<ObjectWithXandYProperties>> VariableDataContextIsSetTo { get; set; }
访问ObservableCollection
的特定索引将返回列表。然后,该列表中的项目显示在图表上。
答案 0 :(得分:1)
我认为最简单的方法是在您的课程中添加一个属性int
的{{1}}值。
e.g。
List
或者你也可以创建一个转换器,它将列表作为绑定,索引作为参数,并返回所需的值。
例如(我还没试过):
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();
}
}
在Window(或UserControl)的资源中,添加对转换器的引用,如下所示:
xmlns:local="clr-namespace:WpfApplication2"
在绑定中,指定要使用的转换器(使用其键)
<Window.Resources>
<local:ElementOfListConverter x:Key="ElemOfList" />
</Window.Resources>
此方法的专业版是您可以直接在xaml中指定元素的索引。您还可以使用MultiBinding
和MultiValueConverter
将此值绑定到其他值。 (如果您需要更多信息,请参阅this question on S.O.。