or
<
DataTemplate
DataType
=
"{x:Type local:SplitButtonVisualCommand}"
>
<
telerik:RadSplitButton
Command
=
"{Binding Command}"
CommandParameter
=
"{Binding GetParameters}"
Opacity
=
"{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource DisabledWorkAround}}"
IsToggle
=
"{Binding RelativeSource={RelativeSource Self}, Path = IsOpen}"
DropDownContent
=
"{Binding Childs}"
DropDownContentTemplateSelector
=
"{StaticResource VisualTempSelector}"
>
<
telerik:RadSplitButton.Content
>
<
StackPanel
Orientation
=
"Horizontal"
>
<
Image
Source
=
"{Binding Image}"
Margin
=
"0 0 2 0"
/>
<
TextBlock
Text
=
"{Binding Caption}"
/>
</
StackPanel
>
</
telerik:RadSplitButton.Content
>
</
telerik:RadSplitButton
>
</
DataTemplate
>
<
DataTemplate
DataType
=
"{x:Type VisualCommands:VisualCommandCollection}"
>
<
telNav:RadContextMenu
ClickToOpen
=
"False"
ItemsSource
=
"{Binding}"
ItemTemplateSelector
=
"{StaticResource VisualTemplateSelector}"
/>
</
DataTemplate
>
<
DataTemplate
DataType
=
"{x:Type local:ContextMenuVisualCommand}"
>
<
telNav:RadMenuItem
Header
=
"{Binding Caption}"
Icon
=
"{Binding Image}"
ItemsSource
=
"{Binding Childs}"
ItemTemplateSelector
=
"{StaticResource VisualTemplateSelector}"
Command
=
"{Binding Command}"
CommandParameter
=
"{Binding GetParameters}"
Opacity
=
"{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource DisabledWorkAround}}"
>
</
telNav:RadMenuItem
>
</
DataTemplate
>
ItemTemplateSelector.SelectTemplate
gets called Twice for each sub item in the SplitButton DropDownContent, this might explain the extra box inside the MenuItem.protected
string
myproperty;
[Category(
"MyCategory"
)]
public
string
MyProperty{
get
;
set
; }
RadPropertyGrid1.Item = n;
internal sealed class DynamicCategoricalSeriesBehavior : ChartBehavior
{
private class SeriesInfo
{
public string SeriesKey { get; private set; }
public int Index { get; set; }
public SeriesInfo(string seriesKey, int seriesIndex)
{
Index = seriesIndex;
SeriesKey = seriesKey;
}
}
private Dictionary<
CategoricalSeries
, SeriesInfo> _categoricalSeries;
protected override void OnAttached()
{
base.OnAttached();
Chart.DataContextChanged += chartDataContextChanged;
listenToDataContextPropertyChanged(Chart.DataContext as INotifyPropertyChanged);
}
protected override void OnChartTemplateChanged(Canvas oldAdornerContainer, Canvas adornerContainer)
{
base.OnChartTemplateChanged(oldAdornerContainer, adornerContainer);
saveCategoricalSeriesValuePropertyNames();
transformMetricsForSeries(Chart as RadCartesianChart);
}
private void saveCategoricalSeriesValuePropertyNames()
{
var cartesianChart = Chart as RadCartesianChart;
if (cartesianChart == null)
return;
_categoricalSeries = new Dictionary<
CategoricalSeries
, SeriesInfo>();
var seriesIndex = 0;
foreach (var series in cartesianChart.Series)
{
var catSeries = series as CategoricalSeries;
if (catSeries == null)
continue;
var propertyNameValueBinding = catSeries.ValueBinding as PropertyNameDataPointBinding;
if (propertyNameValueBinding == null)
continue;
_categoricalSeries[catSeries] = new SeriesInfo(propertyNameValueBinding.PropertyName, seriesIndex++);
}
}
private void chartDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
listenToDataContextPropertyChanged(Chart.DataContext as INotifyPropertyChanged);
}
private void listenToDataContextPropertyChanged(INotifyPropertyChanged vm)
{
if (vm == null)
return;
vm.PropertyChanged += (o, args) =>
{
if (args.PropertyName == "DynamicDataSeries")
transformMetricsForSeries(Chart as RadCartesianChart);
};
}
private void transformMetricsForSeries(RadCartesianChart chart)
{
if (chart == null)
return;
var dynamicVM = Chart.DataContext as IDynamicMetricsValueSeriesProvider<
double
>;
if (dynamicVM == null)
return;
var supportedSeries = dynamicVM.DynamicDataSeries.Select(series => series.SeriesKey).ToList();
foreach (var kvp in _categoricalSeries)
{
var series = kvp.Key;
var seriesKey = kvp.Value.SeriesKey;
if (!supportedSeries.Contains(seriesKey))
{
removeSeries(chart, series, seriesKey);
continue;
}
insertSeries(chart, series, seriesKey, dynamicVM);
}
}
private void insertSeries(RadCartesianChart chart, CategoricalSeries series, string key, IDynamicMetricsValueSeriesProvider<
double
> seriesProvider)
{
if (series.Visibility != Visibility.Visible)
{
series.Visibility = Visibility.Visible;
var index = _categoricalSeries[series].Index;
chart.Series.Insert(index, series);
}
var dataPoints = seriesProvider.MetricsData.Where(i => i.MetricsId == key).ToList();
series.ValueBinding = new PropertyNameDataPointBinding("Value");
series.ItemsSource = dataPoints;
var stroked = series as CategoricalStrokedSeries;
if (stroked != null)
stroked.Stroke = seriesProvider.GetMetricsDataColorBrush(key);
}
private void removeSeries(RadCartesianChart chart, CategoricalSeries series, string key)
{
chart.Series.Remove(series);
series.Visibility = Visibility.Collapsed;
}
}