Как добавить поддержку вывода текста в ComboBox WPF? - PullRequest
0 голосов
/ 10 июля 2010

Это мой ComboBox:

            <ComboBox Name="ApplicationList" MinWidth="200" Margin="4" >
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding ApplicationName}"/>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

Если в поле со списком есть только строки, я получаю поддержку при вводе текста бесплатно. Но как мне включить поддержку уменьшения количества типов для сложных объектов?

Ответы [ 4 ]

4 голосов
/ 10 июля 2010

Установите TextSearch.TextPath на имя свойства:

<ComboBox Name="ApplicationList" TextSearch.TextPath="ApplicationName" MinWidth="200" Margin="4">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ApplicationName}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Из документации:

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

РЕДАКТИРОВАТЬ: установка IsEditable в True не требуется.

2 голосов
/ 10 июля 2010

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

DisplayMemberPath="ApplicationName"

вместо указания ItemTemplate.

Если вам нужны дополнительные параметры для форматирования ваших элементов, для которых требуется использование ItemTemplate, установите TextSearch.TextPath в свойство, для которого вы хотите сделать выбор текста:

TextSearch.TextPath="ApplicationName"
2 голосов
/ 10 июля 2010

Я вижу, что вы не хотите переопределять ToString () в вашей модели , что имеет смысл. Но если вы привязываете свой View (код xaml) к Model , то вы упускаете преимущества наличия посредника: ViewModel .

В вашей ситуации я бы хотел обернуть отдельные элементы в ApplicationList с помощью ViewModel . Предположим, что ApplicationList является коллекцией типа ApplicationModel , поэтому, возможно, ObservableCollection . Если вы измените это на ObservableCollection <** ApplicationViewModel </strong>> , где каждый ** ApplicationViewModel имеет личную ссылку на ApplicationModel , вы можете сойти с ума с представлением этот объект. Вы можете добавить ToString , DateTime создания и все, что имеет отношение к пользовательскому интерфейсу, без необходимости использовать вашу модель .

.
public class ApplicationViewModel
{
   private ApplicationModel _application;
   private DateTime _creationDate;

   public ApplicationViewModel(ApplicationModel application)
   {
      _application = application;
      _creationDate = DateTime.Now;
   }

   public override string ToString()
   {
      return _application.ApplicationName + ", " + _creationDate.ToString();
   }

}

Дело в том, что ни один класс не может коснуться вашего ApplicationModel класса, кроме как благодаря жесткому контролю над классом ApplicationViewModel , предоставляя вам полную возможность поиграть с вещами, относящимися к пользовательский интерфейс. Делайте это с каждым классом, и вы никогда не будете оглядываться назад. Еще одним бонусом является то, что вы можете очень легко протестировать классы Model , не мешая работе интерфейса.

0 голосов
/ 10 июля 2010

Обходной путь - переопределить метод ToString в модели, но я ищу более общее решение.

...