作成日: 2021/01/26 最終更新日: 2021/01/26
文書種別
使用方法
詳細
SeriesクラスはFrameworkElementではないため、例えば、シリーズのSymbolRenderingイベントをViewModelにバインドし、そのイベント内でチャートのシンボルをカスタマイズするといったようなことはできません。
シリーズのSymbolRenderingイベントをViewModelにバインドするには、ViewModelのプロパティにバインド可能なAction型のプロパティを持つ、拡張Seriesクラスを作成する方法が考えられます。なお、バインディングのソースを明示的に指定するため、Freezableオブジェクトを継承したカスタムBindingProxyクラスを使用します。
【サンプルコード】(※抜粋)
(XAML)
(コード)
シリーズのSymbolRenderingイベントをViewModelにバインドし、そのイベント内でチャートのシンボルを赤く塗りつぶすサンプルプロジェクトの全体的なコードを以下に記載します。
(MainWindow.xaml)
(MainWindow.xaml.cs)
シリーズのSymbolRenderingイベントをViewModelにバインドするには、ViewModelのプロパティにバインド可能なAction型のプロパティを持つ、拡張Seriesクラスを作成する方法が考えられます。なお、バインディングのソースを明示的に指定するため、Freezableオブジェクトを継承したカスタムBindingProxyクラスを使用します。
【サンプルコード】(※抜粋)
(XAML)
<c1:C1FlexChart.Series>
<local:SeriesEx Binding="Y" SymbolRenderingAction="{Binding Path=Data.SymbolRenderingAction, Source={StaticResource Proxy}}" SeriesName="Series 1" ChartType="LineSymbols"></local:SeriesEx>
</c1:C1FlexChart.Series>
(コード)
public class SeriesEx : Series
{
public Action<RenderSymbolEventArgs> SymbolRenderingAction
{
get { return (Action<RenderSymbolEventArgs>)GetValue(SymbolRenderingActionProperty); }
set { SetValue(SymbolRenderingActionProperty, value); }
}
・・・途中省略・・・
public class ViewModel : Caliburn.Micro.PropertyChangedBase
{
public void SymbolRendering(RenderSymbolEventArgs args)
{
//args.Engine.SetFill(Brushes.Red);
args.Engine.SetFill(Brushes.Violet);
}
シリーズのSymbolRenderingイベントをViewModelにバインドし、そのイベント内でチャートのシンボルを赤く塗りつぶすサンプルプロジェクトの全体的なコードを以下に記載します。
(MainWindow.xaml)
<Window x:Class="FlexChartEventMVVM.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:FlexChartEventMVVM"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cal="http://www.caliburnproject.org"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<local:BindingProxy x:Key="Proxy" Data="{Binding}"></local:BindingProxy>
</Window.Resources>
<Grid>
<c1:C1FlexChart x:Name="flexChart" BindingX="X" ItemsSource="{Binding Data}">
<c1:C1FlexChart.Series>
<local:SeriesEx Binding="Y" SymbolRenderingAction="{Binding Path=Data.SymbolRenderingAction, Source={StaticResource Proxy}}" SeriesName="Series 1" ChartType="LineSymbols"></local:SeriesEx>
</c1:C1FlexChart.Series>
</c1:C1FlexChart>
</Grid>
</Window>
(MainWindow.xaml.cs)
using C1.Chart;
using C1.WPF.Chart;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace FlexChartEventMVVM
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
public class Command : ICommand
{
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
throw new NotImplementedException();
}
public void Execute(object parameter)
{
throw new NotImplementedException();
}
}
public class SeriesEx : Series
{
public Action<RenderSymbolEventArgs> SymbolRenderingAction
{
get { return (Action<RenderSymbolEventArgs>)GetValue(SymbolRenderingActionProperty); }
set { SetValue(SymbolRenderingActionProperty, value); }
}
public static readonly DependencyProperty SymbolRenderingActionProperty =
DependencyProperty.Register("SymbolRenderingAction", typeof(Action<RenderSymbolEventArgs>), typeof(SeriesEx), new PropertyMetadata(null));
public SeriesEx()
{
SymbolRendering += SeriesEx_SymbolRendering;
}
private void SeriesEx_SymbolRendering(object sender, RenderSymbolEventArgs e)
{
SymbolRenderingAction?.Invoke(e);
}
}
public class ViewModel : Caliburn.Micro.PropertyChangedBase
{
private List<Point> _data;
public List<Point> Data => _data.OrderBy(x => x.X).ToList();
public ViewModel()
{
_data = new List<Point>();
_data.Add(new Point(10, 20));
_data.Add(new Point(11, 24));
_data.Add(new Point(9, 11));
_data.Add(new Point(12, 15));
_data.Add(new Point(5, 7));
}
public Action<RenderSymbolEventArgs> SymbolRenderingAction
{
get
{
return new Action<RenderSymbolEventArgs>((args) => {
SymbolRendering(args);
});
}
}
public void SymbolRendering(RenderSymbolEventArgs args)
{
args.Engine.SetFill(Brushes.Red);
}
}
/// <summary>
/// this class is used for providing access of DataContext to non framework elements
/// </summary>
public class BindingProxy : Freezable
{
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new PropertyMetadata(null));
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
}
}
関連情報
旧文書番号
86359