2013-10-14 3 views
1

Я использую ComboBox с CheckBox как ItemTemplate, и я хочу перебирать все элементы, получать их статус проверки и записывать их содержимое в строку, если отмечено true. Проблема в том, что я использую SqlDataReader для заполнения и привязки ComboBox из базы данных, и я не могу найти способ доступа к свойствам IsChecked.Итерации через элементы ComboBox при использовании CheckBox в качестве ItemTemplate

<ComboBox> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox Click="CheckBox_Click" Content="{Binding}" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" Tag="{RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Я попытался отливать детали ComboBox как CheckBoxes на события нажатия из них так:

private void CheckBox_Click(object sender, RoutedEventArgs e) 
{  
    for (int i = 0; i < myComboBox.Items.Count; i++) 
    { 
     CheckBox cb = (myComboBox.Items[i] as CheckBox); 
     if (cb.IsChecked == true) 
     { 
      myString += "," + myComboBox.SelectedItem.ToString() + ""; 
     } 
    } 
} 

но центибар всегда возвращает NULL. Я предполагаю, что это связано с привязкой свойства IsChecked.

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

+0

ах, это было навсегда, так как я сделал это, но я довольно уверен, что проблема в том, что дерево управления и логическое дерево отличаются, поэтому я думаю, что вам нужно искать элемент управления. Чтобы упростить вашу жизнь, просто используйте привязку данных и создайте свой собственный тип, и просто установите свойство на свой тип равным true. –

+2

Не обрабатывайте элементы пользовательского интерфейса в процедурном коде в WPF. Для этого и предназначен XAML. Обработайте это на уровне ViewModel. –

+1

Не перебирайте флажки. Итерации через ItemsSource Combobox – Shoe

ответ

0

Вы могли бы сделать что-то вроде этого (я не придерживаться MVVM шаблон), и это написано на лету:

public ArrayList List { get; set; } 
     public MainWindow() 
     { 
      InitializeComponent(); 


      SqlDataReader rdr = cmd.ExecuteReader(); 
      List = new ArrayList(); 
      while (rdr.Read()){ 
       List.Add(new Class{ Id = rdr.GetString(0), Value = rdr.GetString(1), IsChecked= rdr.GetString(1) as bool}); //this class will contain the same data schema in your datareader but using properties 
      } 
      rdr.Close(); 
      DataContext = List; 
     } 

    <ComboBox Name="ComboBox" ItemsSource="{Binding}" > 
      <ComboBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <CheckBox Tag="{Binding Id}" Content="{Binding Name}" IsChecked="{Binding IsChecked}"/> 
        </StackPanel> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 

     </ComboBox> 
+0

Спасибо, Hichem. Я не использовал ваш код, но у меня появилась идея. Я создал список класса, который я заполняю DataReader, а затем привязываю этот список в ItemsSource ComboBox. Теперь я могу перебирать список и получать их свойства по своему усмотрению. – ceferrari

+0

Это была именно цель. – HichemSeeSharp

Смежные вопросы