作成日: 2021/01/25 最終更新日: 2021/01/25
文書種別
使用方法
詳細
C1FlexChartのSeriesクラスはFrameworkElementではないため、DataContextを継承せず、直接Bindingを設定しても正しく動作しません。
例えば、SeriesクラスのVisibilityプロパティを標準CheckBoxの値に直接バインドして、CheckBoxのチェックがONの場合にシリーズを表示し、OFFの場合にシリーズを非表示にするといったことはできません。
【サンプル】※抜粋。正しく動作しません。
(XAML)
シリーズレベルでバインディングを機能させるには、バインディングのソースを明示的に提供する必要があります。これは、次のようにFreezableオブジェクトを継承したカスタムのBindingProxyクラスを使用して実装します。
【サンプル】※抜粋。
(XAML)
以下にプロジェクト全体のコードを記載します。
※MainWindowにC1FlexChartとCheckBoxコントロールを配置して、動作をご確認ください。
(MainWindow.xaml)
例えば、SeriesクラスのVisibilityプロパティを標準CheckBoxの値に直接バインドして、CheckBoxのチェックがONの場合にシリーズを表示し、OFFの場合にシリーズを非表示にするといったことはできません。
【サンプル】※抜粋。正しく動作しません。
(XAML)
<c1:C1FlexChart
x:Name="Chart"
Grid.Row="0"
ChartType="Line"
ItemsSource="{Binding Datas, Mode=TwoWay}"
Binding="Index">
<c1:Series
x:Name="Series1"
Binding="Series1"
Visibility="{Binding Series1Visibility, Mode=TwoWay}">
<c1:Series.Style>
<c1:ChartStyle
Stroke="Black"/>
</c1:Series.Style>
</c1:Series>
</c1:C1FlexChart>
シリーズレベルでバインディングを機能させるには、バインディングのソースを明示的に提供する必要があります。これは、次のようにFreezableオブジェクトを継承したカスタムのBindingProxyクラスを使用して実装します。
【サンプル】※抜粋。
(XAML)
<c1:Series
x:Name="Series1"
Binding="Series1"
Visibility="{Binding Path=DataContext.Series1Visibility, Source={StaticResource Proxy}}">
<c1:Series.Style>
<c1:ChartStyle
Stroke="Black"/>
</c1:Series.Style>
</c1:Series>
(コード) public class BindingProxy : Freezable
{
public object DataContext
{
get { return (object)GetValue(DataContextProperty); }
set { SetValue(DataContextProperty, value); }
}
public static readonly DependencyProperty DataContextProperty =
DependencyProperty.Register("DataContext", typeof(object), typeof(BindingProxy), new PropertyMetadata(null));
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
}
以下にプロジェクト全体のコードを記載します。
※MainWindowにC1FlexChartとCheckBoxコントロールを配置して、動作をご確認ください。
(MainWindow.xaml)
<Window x:Class="Sample.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Sample"
xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:MainWindowViewModel x:Name="ViewModel"/>
</Window.DataContext>
<Window.Resources>
<local:BindingProxy x:Key="Proxy" DataContext="{Binding}"></local:BindingProxy>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
<c1:C1FlexChart
x:Name="Chart"
Grid.Row="0"
ChartType="Line"
ItemsSource="{Binding Datas, Mode=TwoWay}"
Binding="Index">
<c1:Series
x:Name="Series1"
Binding="Series1"
Visibility="{Binding Path=DataContext.Series1Visibility, Source={StaticResource Proxy}}">
<c1:Series.Style>
<c1:ChartStyle
Stroke="Black"/>
</c1:Series.Style>
</c1:Series>
</c1:C1FlexChart>
<CheckBox
x:Name="SeriesVisibilityCheckBox"
Grid.Row="1"
Content="Series 表示"
Checked="SeriesVisibilityCheckBox_Checked"
Unchecked="SeriesVisibilityCheckBox_Unchecked" IsChecked="True"/>
</Grid>
</Window>
(コード:MainWindow.xaml.cs)using C1.Chart;
using C1.WPF.Chart;
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace Sample
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private MainWindowViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = this.DataContext as MainWindowViewModel;
}
private void SeriesVisibilityCheckBox_Checked(object sender, RoutedEventArgs e)
{
if (vm != null)
{
vm.SetVisiblity(true);
}
}
private void SeriesVisibilityCheckBox_Unchecked(object sender, RoutedEventArgs e)
{
if (vm != null)
{
vm.SetVisiblity(false);
}
}
}
public class BindingProxy : Freezable
{
public object DataContext
{
get { return (object)GetValue(DataContextProperty); }
set { SetValue(DataContextProperty, value); }
}
public static readonly DependencyProperty DataContextProperty =
DependencyProperty.Register("DataContext", typeof(object), typeof(BindingProxy), new PropertyMetadata(null));
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
}
}
(コード:MainWindowViewModel.cs)using System.Collections.ObjectModel;
using System.ComponentModel;
using C1.Chart;
namespace Sample
{
public class MainWindowViewModel : INotifyPropertyChanged
{
private SeriesVisibility _series1Visibility = SeriesVisibility.Visible;
private ObservableCollection<Data> _datas = new ObservableCollection<Data>();
private double[] _sampleDatas = new double[10]
{
1 , 3 , 1 , 3 , 1 , 3 , 1 , 3 , 1 , 3 ,
};
public MainWindowViewModel()
{
SetDatas();
}
public SeriesVisibility Series1Visibility
{
get
{
return _series1Visibility;
}
set
{
_series1Visibility = value;
NotifyPropertyChanged("Series1Visibility");
}
}
public ObservableCollection<Data> Datas
{
get
{
return _datas;
}
set
{
if (_datas == value)
{
return;
}
_datas = value;
NotifyPropertyChanged("Datas");
}
}
public void SetVisiblity(bool check)
{
var tmp = check ? SeriesVisibility.Visible : SeriesVisibility.Hidden;
Series1Visibility = check ? SeriesVisibility.Visible : SeriesVisibility.Hidden;
}
private void SetDatas()
{
Datas.Clear();
for (int i = 0; i < _sampleDatas.Length; i++)
{
Datas.Add(new Data()
{
Index = i,
Series1 = _sampleDatas[i],
});
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string PropertyName)
{
var e = new PropertyChangedEventArgs(PropertyName);
PropertyChanged?.Invoke(this, e);
}
public class Data
{
/// <summary>
/// インデックス(X軸の値)
/// </summary>
public int Index { get; set; }
/// <summary>
/// Series1のY軸の値
/// </summary>
public double Series1 { get; set; }
}
}
}
関連情報
旧文書番号
86354