XAML ReadOnly ComboBox - PullRequest
       29

XAML ReadOnly ComboBox

6 голосов
/ 03 февраля 2011

Чтобы настроить ReadOnly ComboBox в XAML (WPF), необходимо настроить ComboBox и TextBox, отображающие только одно из них в соответствии с парой свойств IsReadOnly / IsEditable, которыедолжен существовать на вашем ViewModel.Обратите внимание, что в этом примере "UserNVL" должен существовать в ресурсах, и это должна быть коллекция NameValueList, которая позволяет нам преобразовывать ID в имена.В этом случае RecipientID является ключом для имени пользователя.Обратите внимание, что VisibilityConverter также должен присутствовать в ресурсах, и это стандарт BooleanToVisibilityConverter.

Черт возьми!Это было так трудно найти, я должен был сделать это сам.Это позволяет пользователю выбирать содержимое текстового поля.Никоим образом отключенный ComboBox никогда не позволит вам сделать это.

Ответы [ 5 ]

5 голосов
/ 03 октября 2013

Существует два свойства: IsHitTestVisible и IsTabVisible.первый делает управление глухим к событиям мыши, а второй к событиям клавиатуры.Это может помочь вам, так как это не придаст отключенному виду ваше поле со списком, но вы преуспеете в создании поля со списком только для чтения. Источник: - http://www.telerik.com/community/forums/wpf/combobox/isreadonly-does-seem-to-work.aspx

3 голосов
/ 03 февраля 2011
<DockPanel>
  <TextBlock Text="Recipient" Margin="6,9,3,6" HorizontalAlignment="Right"/>
  <ComboBox
      x:Name="RecipientID"
      ItemsSource="{Binding Source={StaticResource UserNVL}}"
      DisplayMemberPath="Value"
      SelectedValuePath="Key"
      SelectedValue="{Binding Path=RecipientID}"
      Height="20"
      Margin="6,6,0,6"
      MinWidth="200"
      HorizontalAlignment="Left"
      IsEditable ="True"
      Visibility="{Binding Path=IsEditable, Converter={StaticResource VisibilityConverter}}"/>
  <TextBox
      x:Name="RecipientName"
      Text="{Binding ElementName=RecipientID, Path=Text}"
      Margin="6,6,0,6"
      MinWidth="200"
      HorizontalAlignment="Left"
      Style="{StaticResource textBoxInError}"
      Visibility="{Binding Path=IsReadOnly, Converter={StaticResource VisibilityConverter}}"/>
</DockPanel>
1 голос
/ 20 марта 2017

Я думаю, вам будет гораздо проще и практичнее создать класс для расширения класса ComboBox очень простым способом:

  1. переопределить метод OnSelectionChanged в Combobox, чтобы проверить свойство IsReadOnlyпрежде чем позволить base.OnSelectionChanged (e) для запуска.

Таким образом, вам просто нужно установить для свойства ComboBox.IsReadOnly значение True.Нет большого XAML, чтобы писать везде ...

1 голос
/ 03 декабря 2015

Если для IsEnabled установлено значение false, значение Combobox практически не читается.Как подходящее решение я нашел следующее:

  • поле со списком и текстовое поле (отформатировано как только для чтения) находятся в одной и той же позиции сетки
  • область со списком комбинируется в следующий столбец, чтобы получить дополнительную ширину 15, поэтому кнопка раскрывающегося списка
  • textbox.IsVisible привязан к combobox.IsEnabled с конвертером bool в видимостьв .DisplayText of it)
1 голос
/ 03 февраля 2011

Почему бы просто не установить IsEnabled = false?

...