Чтобы действительно это произошло, у вас есть два варианта.
Привязка отображаемых элементов Свойство Brush к свойству Brush в данных
У источника данных есть свойство, показывающее, какую кисть вы хотите использовать для каждого элемента, и вы привязываете свойство отображаемого элемента, который принимает кисть, например, свойство Fill
. Это работает, если набор различных значений, которые вы имели бы для пар значений Start и Stop, невелик. Вы создадите экземпляр каждой кисти для каждой пары, а затем элемент данных отобразит правильный.
Связывание отображаемых элементов Свойство Brush с помощью преобразователя значений
Если значения Start и Stop имеют большую переменную, вам потребуется новый экземпляр типа Brush для каждого отображаемого элемента. В этом случае вы должны связать свойство кисти отображаемых элементов с помощью конвертера значений, например: -
<Rectangle Fill="{Binding Converter={StaticResource MyBrushBuilder} }" ... >
См. ответ для полного описания создания конвертера.
В этом случае реализация метода преобразования будет выглядеть следующим образом: -
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
YourItemsType item = (YourItemsType)value;
var start = new GradientStop();
start.Offset = 0;
start.Color = item.GradientStart;
var stop = new GradientStop();
stop.Offset = 1;
stop.Color = item.GradientStop;
var result = new RadialGradientBrush();
result.GradientOrigin = new Point(0.20, 0.5);
result.Center = new Point(0.25, 0.5);
result.RadiusX = 0.75;
result.RadiusY = 0.5;
result.GradientStops = new GradientStopCollection();
result.GradientStops.Add(start);
result.GradientStops.Add(stop);
return result;
}
Протест
Всякий раз, когда происходит связывание данных, создается целая куча кистей по одной для каждого элемента. Это может быть дорого и нежелательно. Следовательно, если этот подход с привязкой к конвертеру будет сочтен необходимым, я рекомендую вам использовать статический словарь кистей. Ключом в этом словаре будет хэш двух цветов. Вы будете создавать новую кисть только при необходимости и повторно использовать ранее созданную кисть, когда это возможно.