none
Как построить WPF ComboBox, в выпадающем списке которого отображалось бы несколько колонок из источника привязки? RRS feed

  • Вопрос

  • Предположим, у меня в WPF-приложении (которое строится по шаблону MVVM) в модели есть класс:

    // Информация о товаре
    class ProductInfo
    {
       // Наименование
       public String Name{get; set;}
       // Цена
       public Double Price{get; set;}
       // Остаток на складе
       public Int32  Rest{get; set;}
    } 
       

    В приложении, в модели представления, я определяю ObservableCollection, в которой хочу хранить экземпляры ProductInfo.

    ObservableCollection myCol = new ObsorvableCollection<ProductInfo>();

    В окне приложения (в представлении) у меня есть ComboBox, который я хочу привязать к этой ObservableCollection. Но привязать я его хотел бы так, что бы в его выпадающкм списке показывалась информация из трёх вышеназванных колонок. Т.е. чтобы выпадающий список комбобокса был в виде грида, в шапке которого были бы названия колонок, а в столбцах - соответствующие данные. Ну что бы выпадающий список комбобокса имел вид грида (в данном случае из трёх колонок), а в закрытом состоянии показывал, как обычно, данные только из одного поля выбранного элемента, например, из поля Name. Дайте, пожалуйста, кто-нибудь ссылку на материалы, по которым можно было бы построить в  приложении WPF подобный комбобокс.




    • Изменено TownSparrow 4 июля 2013 г. 9:13

Ответы

Все ответы

  • Вот пара вариантов:

    WPF Custom ComboBox

    WPF DataGrid as ComboBox Dropdown

    • Помечено в качестве ответа TownSparrow 5 июля 2013 г. 8:06
    4 июля 2013 г. 10:49
  • Самый простой способ - это использовать DataTemplate'ы   и триггеры. Вот самый простой пример:

            <ComboBox x:Name="combo">
                <ComboBox.ItemTemplate>
                    <DataTemplate>                    
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Name}"/>
                            <TextBlock Text="{Binding Price}" Name="price"/>
                            <TextBlock Text="{Binding Rest}" Name="rest"/>
                        </StackPanel>
                        <DataTemplate.Triggers>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=IsDropDownOpen}" Value="False">
                                <Setter TargetName="price" Property="Visibility" Value="Collapsed"/>
                                <Setter TargetName="rest" Property="Visibility" Value="Collapsed"/>
                            </DataTrigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

    4 июля 2013 г. 10:54
    Модератор
  • Спасибо, Кирилл, я уже прочитал статью WPF DataGrid as ComboBox Dropdown. Но там автор использует Expression Blend, которого у меня на компьютере нет. Интересно, что в WPF Custom ComboBox? Прочитаю. Кстати у статьи WPF DataGrid as ComboBox Dropdown есть продолжение:

    http://www.nullskull.com/a/1428/wpf-datagrid-as-combobox-dropdown-part-2.aspx 

    Сейчас читаю его.

    4 июля 2013 г. 12:33
  • Спасибо, Ulсer. Но по этому шаблону ComboBox будет и в закрытом состоянии показывать в своём текстовом поле все колонки выбранного элемента. А мне нужно что бы в этом случае показывалась только одна из них. Оба выши ответа ценные - и ваш и Кирилла. Спасибо большое.

    • Изменено TownSparrow 4 июля 2013 г. 12:39 поправил
    4 июля 2013 г. 12:38
  • Насколько я понял Expression Blend используется исключительно для редактирования шаблона элемента управления (что можно и в студии сделать). Там же исходники есть! Смотрели?
    4 июля 2013 г. 12:42
  • Смотрел. Но что-то устал сегодня уже голова как положено не работает. Вот в продолжении этой статьи

    http://www.nullskull.com/a/1428/wpf-datagrid-as-combobox-dropdown-part-2.aspx

    описывается создание более совершенного контрола подобного рода. Там - выпадающий список как грид, а в закрытом состоянии показывается только одно поле, на которое можно настроить контрол. Это бы хорошо, но у меня в Visual Studio 2010 проект компилируется с ошибками. И полно ошибок. Там во-первых DataGrid взята из тулкита, а в VS 2010 - она своя. Да там полно ошибок возникает. Жалуется, например, что некоторые контролы в проекте не может найти, хотя они там есть. Да, много ошибок. А хотелось бы конечно его применить. Именно вот этот из продолжения.

    4 июля 2013 г. 14:04