Условное форматирование элементов в Combbox

В настоящее время я работаю в команде, создающей сетку данных, содержащую данные, поступающие из модели представления. Мы используем реактивный интерфейс, и каждая «строка» в сетке данных представлена ​​классом модели представления, который наследуется от «ReactiveObject».

В модели представления есть 2 свойства, которые меня интересуют, чтобы заполнить поле со списком в каждой строке. Коллекция PossibleScales и DefaultScale. PossibleScale загружаются в поле со списком, а DefaultScale используется для установки выбранного элемента в DefaultScale. DefaultScale всегда содержится в коллекции DefaultScale. Чего я хочу добиться, так это того, чтобы любой масштаб не по умолчанию в поле со списком был отформатирован курсивом. Поэтому я создал стиль, который вызывает IMultiValueConverter. поэтому мне нужно указать параметры IMultiValueConverter 2, текущую шкалу (из набора PossibleScales и DefaultScale.

Вот XAML, который мы должны заполнить поле со списком всеми элементами в списке PossibleScales (у меня есть то же самое для EditingElementStyle):

<DataGridComboBoxColumn.ElementStyle>
   <Style TargetType="ComboBox">
       <Setter Property="ItemsSource" Value="{Binding Path=PossibleScales}"  />
       <Setter Property="ItemContainerStyle" Value="{StaticResource Measeurementscale}"></Setter>
   </Style>
</DataGridComboBoxColumn.ElementStyle>

Measeurementscale StaticResource определяется как стиль в разделе ресурсов элемента управления.

<Style x:Key="Measeurementscale" TargetType="ComboBoxItem">
    <Setter Property="FontStyle">
       <Setter.Value>
          <MultiBinding Converter="{StaticResource NonDefaultScaleToItalicConverter}">
              <Binding RelativeSource="{RelativeSource Self}" Path="DataContext"/>
          </MultiBinding>
       </Setter.Value>
    </Setter>
</Style>

Как видите, текущее значение элемента со списком передается в IMultiValueConverter, так что это здорово. Но теперь мне интересно, как я могу передать DefaultScale (который является свойством модели представления и определяется как DataContext для элемента управления) этому преобразователю. Я не смог этого сделать.

Любая помощь будет оценена по достоинству.


person sam    schedule 05.02.2013    source источник


Ответы (1)


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

<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ComboBox}"
         Path="DataContext.DefaultScale" />
person Adi Lester    schedule 05.02.2013
comment
Не знаю почему, но FontStyle не работает. Непрозрачность есть, поэтому я использую это вместо этого. Самым важным для меня было иметь визуальную подсказку для шкал не по умолчанию, ваш ответ очень помог. Итак, я достиг своей цели: условное форматирование элементов в поле со списком. - person sam; 06.02.2013