複数シリーズをSilverlight Toolkitチャートにデータバインドする方法
-
06-07-2019 - |
質問
データバインディングを使用して、データをSilverlightツールキットチャートにバインドしようとしています。 シリーズのセットは1つから複数あるため、事前に必要なシリーズの数を判断できません。 また、他の多くのコントロールがこのデータソースにバインドするので、これらのシリーズをプログラムで追加するのではなく、データバインディングモデルに固執したいと思います。
Jeremiah MorrillによるWeb上でこの問題の解決策を示す記事を見つけました。
アプリケーションの実行中にデータバインディングのデータソース値を更新しようとするまで、これは最初は完全に機能しましたが、これは反映されません。 PropertyChangedイベントにサブスクライブされていないかのように。 同じデータをチャートの隣のデータグリッドにバインドしましたが、データバインディングのデータソースの値が変わるたびに、データグリッドは期待通りに変化します。
JeremiahのソリューションのChartHelperには、次の依存関係プロパティがあります
public static readonly DependencyProperty SeriesSourceProperty =
DependencyProperty.RegisterAttached("SeriesSource",
typeof(IEnumerable),
typeof(ChartHelper),
new PropertyMetadata(SeriesSourceChanged));
アプリケーションが起動すると、SeriesSourceChangedイベントが呼び出されます。 ただし、DataBindingのデータソース値が変更されても、これは再度呼び出されません。
質問は次のとおりです:
- このソリューションでPropertyChanged通知をキャプチャするにはどうすればよいですか
- これをキャプチャするために上記のDependencyPropertyに追加できるものはありますか?
- これを達成するためにチャートまたはシリーズに追加する必要があるものですか?
私はこれまで数日間、これに頭を悩ませてきたので、助けや提案は大歓迎です
ありがとう!
解決 2
この問題の解決策を見つけることができず、 visifire のチャートコントロールを使用することになりました
私はこれをカスタマイズする方がはるかに簡単だと感じましたが、データバインディングを使用してこれを実現するきちんとした方法を見つけたことがなく、よりプログラム的なアプローチになりました。
他のヒント
SeriesSourceタイプは、IEnumerableではなくObservableCollectionである必要があります。次に、次のようにします:
private static void SeriesSourceChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var sender = o as YourType;
var newCollection = e.NewValue as ObservableCollection<DataSetViewModel>;
if (newCollection != null)
{
newCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(sender.OnCollectionChanged);
}
}
private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
}