2013-07-31 57 views
4

我正在嘗試使用WPF工具包創建一個圖表,其中Y軸正在通過List()中的值進行更新。我試圖通過特定的索引訪問該值。目前,綁定到List()索引而不是int會創建一個「沒有合適的座標軸可用於繪製相關值」。例外。如何將圖表的軸綁定到List()的特定索引?

這是我到目前爲止,注意我試圖讓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,所以目前所有的行看起來都是一樣的。我想所有的LineSeries都不一樣。我想讓圖表的每個LineSeries的X軸爲TimeStamp(因此它們都具有相同的時間戳),並且各個LineSeries的Y軸值由整數更新爲List(),每個整數都使用單獨的List()

我會嘗試實現一個類型轉換器,但我不完全確定何時/在哪裏做到這一點。

EDIT 2

我得到它的工作我想它的方式!我發現很多幫助from this S.O. question regarding using multiple series in a line chart.

看起來好像一個類型轉換器也能工作,所以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的具體指標將返回列表。然後,該列表中的項目顯示在圖表上。

回答

1

我認爲要做到這一點的最簡單方法是在您的班級中添加一個屬性,該值將爲Listint值。

例如

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.Resources> 
        <local:ElementOfListConverter x:Key="ElemOfList" /> 
    </Window.Resources> 
    
  4. 在你的綁定,使用其關鍵指定轉換器使用({Binding YourElement, Converter={StaticResource ElemOfList}, ConverterParameter=0}

這種方法好處在於,你可以在XAML直接指定元素的索引。您還可以使用MultiBindingMultiValueConverter將此值綁定到其他值。 (見this question on S.O.,如果你需要更多的信息的話,

+0

我不太熟悉在哪裏實現一個類型轉換器,但是我會放棄它,我會用更多的細節更新我的問題,如果有幫助的話。沒有正確地實施解決方案,但現在我會把它記錄下來,以我自己的經驗不足,並會接受答案。 – jporcenaluk

+0

我會添加如何使用它的信息,如果你想 – Shimrod

+0

我添加了一個示例代碼,不猶豫,告訴我,如果你需要更多的信息! – Shimrod

相關問題