4

Y 軸が の値によって更新されている WPF ツールキットを使用してグラフを作成しようとしています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()ではなくa のインデックスにバインドするにはどうすればよいintですか?

編集

インデックスに名前を付けることでコード ビハインドからリスト内の特定の値を取得できましたがLineSeries、チャートの作成時に複数の値が動的に生成されます。それぞれを a のインデックスにバインドしたいと思いList<int>()ます。これは1秒ごとに再作成します。

MemoryStatsUI を更新するために使用する完全なメソッドを次に示します。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

思い通りに動くようになりました!折れ線グラフで複数のシリーズを使用することに関して、この SO の質問から多くの助けが見つかりました。

型コンバーターも同様に機能するように見えるので、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

これを行う最も簡単な方法は、のint値になるプロパティをクラスに追加すること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();
    }
}

編集

コンバーターを使用する手順は次のとおりです。

  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 で直接指定できることです。MultiBindingaおよび aを使用して、この値を他の値にバインドすることもできますMultiValueConverter。(詳細情報が必要な場合は、SO に関するこの質問を参照してください。

于 2013-07-31T20:19:17.027 に答える