2013-10-14 36 views
1

我使用ComboBox作爲ItemTemplate作爲CheckBox,我想迭代所有項目,獲取它們的檢查狀態並將其內容寫入字符串(如果選中爲true)。問題是我使用SqlDataReader從數據庫中填充和綁定ComboBox,我找不到訪問項目IsChecked屬性的方法。當使用CheckBox作爲ItemTemplate時迭代ComboBox項目

<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> 

我試圖鑄造他們的單擊事件的組合框項目爲複選框這樣:

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() + ""; 
     } 
    } 
} 

但CB總是返回NULL。我猜測它是與IsChecked屬性綁定的東西。

我想得到這個工作,但我不想創建一個對象/類來填充組合框,因爲我需要它填充數據庫。我非常感謝任何幫助。

+0

啊,它已經永遠,因爲我已經做到了這一點,但我很確定的問題是,控制樹和邏輯樹不同,所以我認爲你必須搜索控制。爲了讓你的生活更輕鬆,只需使用數據綁定並製作你自己的類型,然後只需將你的類型的屬性設置爲true即可。 –

+2

不要在WPF的程序代碼中操作UI元素。這就是XAML的用途。相反,在ViewModel級別處理此操作。 –

+1

不要遍歷複選框。迭代Combobox的ItemsSource – 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填充的類的List,然後將該列表綁定到ComboBox的ItemsSource上。現在我可以迭代List並按照我的意願獲取它們的屬性。 – ceferrari

+0

這正是目的。 – HichemSeeSharp

相關問題