Я нашел решение после долгих ругательств и расследований. Здесь много движущихся частей, поэтому я собираюсь держать каждую из них как можно более краткой, все же передавая основные моменты.
Для начала у меня есть коллекция объектов, которые я пытаюсь отследить:
public class PileOfFruit
{
public string Name {get; set; }
public int Count { get; set; }
}
В моей модели вида у меня есть коллекция этих объектов.
public class BasketVM
{
...
private ObservableCollection<PileOfFruit> _FruitBasket = new ObservableCollection<PileOfFruit>();
public ObservableCollection<PileOfFruit> FruitBasket
{
get { return _FruitBasket; }
}
...
}
На мой взгляд, я определю круговую диаграмму, которая будет отображать количество фруктов в корзине. Наиболее важным фактором здесь является привязка шаблона к SliceTemplate
<chartingToolkit:Chart x:Name="ExampleChart">
<chartingToolkit:PieSeries ItemsSource={Binding FruitBasket
DependentValueBinding="{Binding Count}"
IndependentValueBinding="{Binding Name}">
<chartingToolkit:PieSeries.Palette>
<visualizationToolkit:ResourceDictionaryCollection>
<ResourceDictionary>
<Style x:Key="DataPointStyle" TargetType="Control">
<Setter Property="Template" Value="{StaticResource SliceTemplate}"/>
</Style>
Теперь в app.xaml или в каком-то другом месте мы можем поместить шаблон для объекта PieDataSeries. Обратите пристальное внимание на значение в Fill Оно связано с независимым значением, которое будет чем-то вроде «банана», «винограда» или чего-то еще. Это в свою очередь передается преобразователю значений.
<converters:FruitToColorConverter x:Key="FruitToColorConverter"/>
<ControlTemplate x:Key="SliceTemplate" TargetType="chart:PieDataPoint">
<Path Data="{TemplateBinding Geometry}"
Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IndependentValue, Converter={StaticResource FruitToColorConverter}}"
Stroke="{TemplateBinding BorderBrush}">
....
Соответствующий конвертер данных - это то, что, в конечном итоге, задает нужный нам цвет. Так что, если мы сделаем что-то вроде этого ...
public class FruitToColorConverter : IValueConverter
{
private SolidColorBrush Default = new SolidColorBrush(Colors.Black);
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null || (!(value is string))) { return Default; }
switch (value as string)
{
case "Apple":
return new SolidColorBrush(Colors.Red);
case "BlueBerry":
return new SolidColorBrush(Colors.Blue);
default:
return Default;
......
И именно так вы получаете правильные цвета каждый раз. Если я что-то пропустил или должен уточнить, пожалуйста, дайте мне знать, чтобы я мог внести исправления. Здесь много движущихся частей .. = P