Вместо того чтобы связывать свойства ScaleX и ScaleY объекта RenderTransform, вы можете связать сам объект RenderTransform.
Проблема в том, что источник является двойным значением, и вам нужно Transform. Таким образом, вы должны иметь возможность преобразовать двойное в ScaleTransform. Для этого вы можете создать IValueConverter:
public class TransformConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is double)
{
double d = (double)value;
return new ScaleTransform { ScaleY = d, ScaleX = d };
}
else
{
return new ScaleTransform();
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Вы не можете указать IValueConverter для использования в TemplateBinding, поэтому вы можете использовать обычную Binding с RelativeSource в качестве TemplatedParent. Как это:
<Rectangle x:Name="ProgressPart" Fill="Blue"
RenderTransform="{Binding Path=Progress, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource converter1}}" >
и вам нужно поместить IValueConverter в ресурсы корня ControlTemplate, в область действия Binding:
<ControlTemplate TargetType="controls:ProgressBar">
<Grid>
<Grid.Resources>
<local:TransformConverter x:Key="converter1" />
</Grid.Resources>