Заполнение ComboBox внутри ListView в WPF - PullRequest
3 голосов
/ 23 февраля 2011

Я заполнил ComboBox внутри ListView.Снимок экрана приведен ниже enter image description here

Как показано выше, вместо «Mac» отображается «M», «a», «c».Почему он разделяет слово на символы?

В коде файла я написал

ItemCategoryDAL itemCategoryDalObj = new ItemCategoryDAL();
            DataTable dataTable = itemCategoryDalObj.GetAllItemCategory();

            listView1.ItemsSource = dataTable.DefaultView;

И в файле .xaml я написал:

<ListView  Height="148" HorizontalAlignment="Left" Margin="23,12,0,0" Name="listView1" VerticalAlignment="Top" Width="447" >
  <ListView.View>
     <GridView>
        - - - - - - - - 
        - - - - - - - -
        <GridViewColumn Header="Category Name" Width="150">
           <GridViewColumn.CellTemplate>
               <DataTemplate>
                  <ComboBox ItemsSource="{Binding Path=IC_NAME }" Width="120" />
               </DataTemplate>
           </GridViewColumn.CellTemplate>
        </GridViewColumn> 
        - - - - - - - - -
        - - - - - - - - -
     </GridView>
  </ListView.View>
</ListView>

Я использую Visual Studio 2010

Снимок экрана dataTable, который я использовал как ItemSource для ListView. (Снято во время отладки) enter image description here

Ответы [ 2 ]

4 голосов
/ 23 февраля 2011

A ComboBox позволяет пользователю выбирать из нескольких элементов.Он заполняет себя, перебирая все элементы в ItemsSource и добавляя каждый элемент в Items.

. Вы устанавливаете ItemsSource в свойство, которое возвращает строку.Поскольку строку можно перебрать, ComboBox заполняет себя элементами, полученными при ее переборе, поэтому строка «Mac» превращается в элементы «M», «a» и «c».

Вот почему вы видите то, что видите.Вопрос на самом деле: что вы ожидали увидеть (или что хотите увидеть) и почему?Какие элементы должен ComboBox отображать?Если вы хотите, чтобы он отображал все имена категорий, которые появляются в DataTable, вы можете сделать что-то вроде:

ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=ItemsSource}"

и затем извлечь столбец IC_Name из каждого элемента, используя DataTemplate:

<ComboBox.ItemTemplate>
   <DataTemplate>
      <TextBlock Text="{Binding IC_Name}"/>
   </DataTemplate>
</ComboBox.ItemTemplate>

Обратите внимание, что при этом произойдут всевозможные неожиданные явления.Например, если только одна строка в таблице имеет значение «Foo» в качестве значения IC_Name, в тот момент, когда пользователь выбирает какое-то другое значение для этой строки и таблица обновляется, значение «Foo» исчезнет из всехComboBox es, что делает невозможным отмену этого изменения пользователем.Кроме того, если пять строк содержат «Foo», каждая ComboBox будет отображать все пять экземпляров «Foo» в выпадающем списке.

0 голосов
/ 23 февраля 2011

Привязка работает, IC_NAME существует и возвращает «Mac» в виде строки.Это неявно преобразуется в перечисляемую строку с тремя записями: «M», «a» и «c».И это тогда ItemsSource вашего ComboBox.

<ComboBox ItemsSource="{Binding Path=IC_NAME }" Width="120" />

Вероятно, это должно быть что-то вроде:

<ComboBox 
  SelectedItem="{Binding Path=IC_NAME}"
  ItemsSource="{Binding Path=NameOfACollectionProperty }" 
  Width="120" />
...