I have a DataTemplate defined in my xaml file that I’d like to access from my ViewModel that I use to manage the layout and look of the chart legend
Here is the DataTemplate I have defined:
<DataTemplate x:Key="CustomLegendTemplate"
DataType="s:SeriesInfo">
<Grid HorizontalAlignment="Right"
VerticalAlignment="Top"
Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- Series icon, binds to SeriesInfo.Stroke -->
<Ellipse Grid.Column="0"
Width="7"
Height="7"
Margin="2 2 8 0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Fill="{Binding Stroke,
Converter={StaticResource ColorToBrushConverter}}" />
<!--Series name (SeriesInfo.SeriesName)-->
<TextBlock Grid.Column="1"
Width="15"
HorizontalAlignment="Right"
FontSize="10"
Text="{Binding SeriesName}" />
<!-- Show or hide the 'Visibility Checkboxes' -->
<Grid Grid.Column="1"
Background="Transparent"
Visibility="{Binding DataContext.ShowVisibilityCheckboxes,
ElementName=PART_LegendItems,
Converter={StaticResource BooleanToVisibilityConverter}}">
<!-- Binds to SeriesInfo.IsVisible to show and hide the series -->
<CheckBox Width="16"
Height="16"
HorizontalAlignment="Right"
VerticalAlignment="Top"
FontSize="10"
Foreground="{Binding Stroke,
Converter={StaticResource ColorToBrushConverter}}"
IsChecked="{Binding IsVisible,
Mode=TwoWay}">
<CheckBox.LayoutTransform>
<ScaleTransform ScaleX="0.7" ScaleY="0.7" />
</CheckBox.LayoutTransform>
</CheckBox>
</Grid>
</Grid>
</DataTemplate>
Now I’d like to access this template from my ViewModel to help manipulate my Legend the ViewModel code I have :
ModifierGroup legendInfo = new ModifierGroup(new LegendModifier()
{
ShowLegend = true,
Orientation = Orientation.Vertical,
Margin = new Thickness(0, 0, 0, 0),
LegendPlacement = LegendPlacement.Inside,
GetLegendDataFor = SourceMode.AllSeries,
ShowVisibilityCheckboxes = true,
FontSize = 8,
Background = (Brush)AxisColor.ConvertFromString("Transparent"),
ShowSeriesMarkers = true
});
Then I add this to a ChartModifier = new ModifierGroup(XAxisDrag, YAxisDrag, ZoomExtents, RubberBandZoom, PanModifier, Rollover, legendInfo);
It is all working beautifully, but how can I reach for the xaml DataTemplate I have defined ?
Thank you for the excellent support
- Anders Persson asked 2 years ago
- You must login to post comments
Hello Andrew and thank you for the response and support.
I want to be able to control the elements of my chart legend. the template I presented allowed me to manipulate the legend on a more granular level .
And perhaps my question was also muddled to some extent due to my ignorance around how to best address this design decision.
I agree it is not a good practice to access Xaml DataTemplates in a ViewModel in the MVVM pattern. I did see an example here where a series template was accessed from the viewmodel .
See the example
At any rate since I am doing this as cleanly as possible using the MVVM pattern what would be the way I could solve this in the view, considering the datatemplate I am using and the
Here is an extract of my surface xaml :
<s:SciChartSurface x:Name="sciChartSurface"
Grid.RowSpan="1"
Grid.Column="0"
Margin="35 0 0 0"
s:ThemeManager.Theme="{Binding GraphTheme,
Mode=TwoWay}"
Annotations="{s:AnnotationsBinding Annotations,
UpdateSourceTrigger=PropertyChanged}"
BorderThickness="0"
**ChartModifier="{Binding ChartModifier}"**
Can I bind it directly to the ChartModifier here ?
Appreciate you support
Thanks
Anders
- Anders Persson answered 2 years ago
- last edited 2 years ago
- You must login to post comments
Hi Anders
It’s considered bad practice to access Xaml DataTemplates in a ViewModel in the MVVM pattern and should be avoided.
I’d ask ‘why do you want to do this?’ aka what problem are you trying to solve?
If you must create & access a Xaml template in Viewmodel, the best way to do this is as follows:
Accessing a resource via codebehind in WPF
- Declare your XAML Template “CustomLegendTemplate” in a resource dictionary linked to App.xaml
-
You can now access it as follows:
var dataTemplate = Application.Current.Resources["CustomLegendTemplate"] as DataTemplate;
Let me know if this helps
Best regards
Andrew
- Andrew Burnett-Thompson answered 2 years ago
- last edited 2 years ago
- You must login to post comments
Please login first to submit.