Пока ваш «Светофор» обернут внутри элемента управления, который, кажется, так и есть, я не думаю, что это ужасно. Каждый эллипс четко определен и имеет разные триггеры, каждый из которых указывает свое собственное состояние. Вы уже включили общие части в базовый стиль, и это хорошо.
Вы можете обернуть отдельные эллипсы внутри другого пользовательского элемента управления (для которого не требуется вспомогательная модель представления), который имеет свойство ActiveState
и свойство ActiveFill
. Тогда ваш TrafficLight выглядит примерно так:
<StackPanel Orientation="Vertical" DataContext="{StaticResource ViewModel}">
<my:Indicator State="{Binding State}" ActiveState="Red" ActiveFill="Red" />
<my:Indicator State="{Binding State}" ActiveState="Amber" ActiveFill="Red" />
<my:Indicator State="{Binding State}" ActiveState="Green" ActiveFill="Green" />
</StackPanel>
Это позволяет вам обернуть все стили Ellipse в элемент управления Indicator, и единственное, о чем нужно беспокоиться, - это сравнение State
с ActiveState
, чтобы определить, должен ли он заполняться кистью ActiveFill
,
Что касается того, стоит ли это усилий или нет, это зависит от того, сколько из них у вас есть, и если вы используете их за пределами вашего пользовательского контроля светофора. Помните: вам это не нужно.