WPF оптимизирован для повторного рисования элементов, когда это абсолютно необходимо, поэтому поведение, которое вы видите, отчасти потому, что WPF не знает, что при изменении Composite.Color ему необходимо заново нарисовать элемент управления.
Кроме того, дизайнер Visual Studio / Blend (или элементы управления XAML) не сможет заметить, что это свойство изменилось, поскольку ваш элемент управления не сигнализирует об изменении этого свойства; без этого уведомления WPF не знает, что свойство изменено (что избавляет его от необходимости постоянно проверять наличие изменений).
Хотя вы могли бы реализовать INotifyPropertyChanged и исправить вторую проблему, поскольку вы наследуете от ContentControl (который высоко в иерархии наследования реализует INotifyPropertyChanged), вы можете использовать DependencyProperty и исправить обе проблемы - и получить лучшее связывание WPF поддержка, чтобы загрузить!
// DependencyProperty backing store for Color. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ColorProperty =
DependencyProperty.Register("Color", typeof(Color), typeof(Composite),
new FrameworkPropertyMetadata(new Color(), FrameworkPropertyMetadataOptions.AffectsRender));
public Color Color
{
get { return (Color)GetValue(ColorProperty); }
set { SetValue(ColorProperty, value); }
}
Устанавливая FrameworkPropertyMetadataOptions.AffectsRender , WPF знает, что при изменении этого свойства необходимо повторно выполнить проход рендеринга для этого элемента, и повторно выполнит рендеринг вашего элемента управления, вызвав метод OnRender (). и отображение нового цвета. И, как DependencyProperty, он автоматически генерирует правильное событие PropertyChanged, так что любой, кто наблюдает за вашим классом (например, системой связывания и анимации WPF), получит уведомление об обновлении, как только свойство будет изменено.