Можно ли выделить ComboBoxItem, но не установить его в качестве выбранного элемента? - PullRequest
0 голосов
/ 01 сентября 2009

У меня есть ComboBox, который я заполняю списком деталей для приложения получения авторизации возврата. В нашей системе RA клиент может указать возврат комплекта, но фактически вернуть только часть комплекта. Поэтому из-за этого мой ComboBox показывает список частей, принадлежащих к комплекту, и просит получателя выбрать, какая часть была фактически получена.

Я обнаружил, что по умолчанию выбранный элемент в моем списке полученных деталей соответствует той части, которая указана в возврате для ленивых получателей, и получена неверная информация о детали. Поэтому я оставил ComboxBox невыбранным.

Я хотел бы выделить указанную часть в ComboBox, фактически не выбирая ее. Таким образом, фактическая часть может быть быстро найдена, но при этом пользователь должен выбрать ее.

Хотя это не сработает, я думаю, что это проиллюстрирует то, что я хотел бы сделать:

<ComboBox Grid.Column="1" ItemsSource="{Binding Path=Part.MasterPart.FamilyParts}" 
          SelectedItem="{Binding Path=ReceivedPart, ValidatesOnDataErrors=True}" >
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">                      
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Part.MaxId}"
                             Value="{Binding Path=Part.MaxId}">
                    <Setter Property="Background" Value="LightSalmon" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

Ответы [ 4 ]

2 голосов
/ 01 сентября 2009

У вас правильная идея. Единственное, что я вижу неправильно в вашем коде - это атрибуты DataTrigger.

Если бы Value был, ну, просто значением, он бы работал:

<DataTrigger Binding="{Binding Path=Part.MaxId}" Value="999" >

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

<DataTrigger Binding="{Binding Path=Part.ShouldHighlight}" Value="true">
1 голос
/ 02 сентября 2009

Вместо добавления свойства в модель представления вы можете использовать селектор стиля (http://msdn.microsoft.com/en-us/library/system.windows.controls.styleselector.aspx), чтобы определить, какой стиль использовать для элемента.

1 голос
/ 01 сентября 2009

Есть и другие способы выделения, кроме установки цвета фона, и я рекомендую вам изучить их, потому что пользователям может быть неудобно иметь разные цвета фона по разным причинам (выбор или выделение). Например, вы можете поставить маленькую звездочку рядом с соответствующими элементами или сделать их жирными.

Тем не менее, вы можете просто сделать это, чтобы установить цвет фона ComboBoxItem:

<ComboBox.ItemContainerStyle>
    <Style TargetType="ComboBoxItem">
        <Setter Property="Background" Value="{Binding Part.MaxId, Converter={StaticResource BackgroundConverter}}"/>
    </Style>
</ComboBox.ItemContainerStyle>

Еще лучше использовать модель представления и просто привязать непосредственно к свойству BackgroundColor:

<ComboBox.ItemContainerStyle>
    <Style TargetType="ComboBoxItem">
        <Setter Property="Background" Value="{Binding BackgroundColor}"/>
    </Style>
</ComboBox.ItemContainerStyle>
0 голосов
/ 01 сентября 2009

Вы на правильном пути, но я бы добавил в ваш класс Part свойство только для чтения, которое сообщало комбобоксу, нужно ли его выделять в этом случае. Вы можете попробовать что-то вроде этого:

<ComboBox Grid.Column="1" ItemsSource="{Binding Path=Part.MasterPart.FamilyParts}" 
          SelectedItem="{Binding Path=ReceivedPart, ValidatesOnDataErrors=True}" >
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <Grid>
        <Border Background="LightSalmon" Visibility="{Binding Part.Highlighted, Converter={StaticResource BoolToVizConverter}}"/>
        <TextBlock Text="{Binding Part.Name}"/>
      </Grid>
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

Таким образом, фон границы вообще не будет отображаться, если выделено как false.

...