Можете ли вы стилизовать первый и последний элементы на панели с помощью чистого XAML и без явного применения стиля? - PullRequest
1 голос
/ 30 июня 2011

Хорошо, я знаю, что в DataBinding вы можете легко настроить таргетинг на первый или последний связанный элемент, но мне интересно, есть ли способ для вас неявно стилизовать первый и последний элемент в подклассе Panel (например, без добавления чего-либокоторый является первым или последним. Я просто хочу использовать порядковый номер.)

Например, у меня есть это ...

<UniformGrid Rows="1">
    <RadioButton Content="First" />
    <RadioButton Content="Middle" />
    <RadioButton Content="Another Middle" />
    <RadioButton Content="Last" />
</UniformGrid>

... и я хочу нацелиться настиль на первом элементе и второй на последнем элементе.

Тем не менее, я знаю, что могу ...

  1. Добавить явный стиль к первому ипоследний элемент или

  2. Добавьте явное присоединенное свойство к первому и последнему элементу и используйте его в триггере стиля.(Именно так я и склоняюсь.)

... но, опять же, я надеюсь избежать того и другого и перейти на чистый XAML с неявным стилем.

Итак, можно ли это сделать?


ОБНОВЛЕНИЕ :

На данный момент я остановился на общем подходе с присоединенными свойствами.Я создал AP с именем UIHelper.Position, которая имеет значения First, Last и Default.Затем мы ссылаемся на него в триггерах внутри шаблона и стиля соответственно.

Это все еще требует, чтобы мы 'помечали' элементы управления с прикрепленным свойством, но это помогает нам преодолеть горб и избегать необходимости создавать несколько стилейс несколькими шаблонами.(Наш шаблон внутренне использовал CornerRadius, который не является свойством шаблонного элемента управления, поэтому мы не могли просто стилизовать его. Это должно было быть сделано в триггерах.)

Тем не менее, если кто-нибудь знает, как это сделатьне прибегая к приложенной собственности, не стесняйтесь ответить ниже.

1 Ответ

0 голосов
/ 30 июня 2011

Что сразу приходит на ум, так это использование селектора шаблонов. Вы можете попытаться отыскать, чтобы оценить расположение объектов в коллекции, в которой он находится, и основывать выбор шаблона на этом.

If myCollection.IndexOf(myObj) = 0 Or myCollection.IndexOf(myObj) = myCollection.Count Then
    Return TryCast(container.FindResource("FirstLastTemplate"), DataTemplate)
Else
    Return TryCast(container.FindResource("MiddleTemplate"), DataTemplate)
End If

Пока не проверял, но, похоже, это сработает. Если вы используете MVVM, вы можете получить доступ к своей ViewModel через контейнер (я думаю).

...