2008-09-24 117 views
18

我有一個列表框,其中項目包含複選框:WPF ListBoxItem的選擇問題

<ListBox Style="{StaticResource CheckBoxListStyle}" Name="EditListBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Click="Checkbox_Click" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Content="{Binding Path=DisplayText}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

我遇到的問題是,當我點擊複選框或其內容,父ListBoxItem中沒有得到選擇。如果點擊複選框旁邊的空格,ListBoxItem會被選中。

我試圖得到的行爲是能夠選擇列表中的一個或多個項目,並使用空格鍵打開和關閉複選框。

一些更多的信息:

private void Checkbox_Click(object sender, RoutedEventArgs e) 
{ 
    CheckBox chkBox = e.OriginalSource as CheckBox; 
} 

在上面,當我點擊複選框的代碼,e.Handled是虛假和chkBox.Parent爲空。

肯特的回答把我放下了正確的道路,這是我結束了:

<ListBox Style="{StaticResource CheckBoxListStyle}" Name="EditListBox" PreviewKeyDown="ListBox_PreviewKeyDown"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" /> 
       <TextBlock Text="{Binding DisplayText}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

我有,當你點擊空格鍵在列表框中使用PreviewKeyDown,因爲默認情況下,它會取消一切除了最近選擇的項目。

回答

10

首先,把CheckBox之外的內容:

<StackPanel Orientation="Horizontal"> 
    <CheckBox IsChecked="{Binding IsChecked}"/> 
    <TextBlock Text="{Binding DisplayText}"/> 
</StackPanel> 

之後,您將需要確保在ListBoxItem導致CheckBox即按空間被檢查。有很多方法可以做到這一點,包括ListBoxItem上的簡單事件處理程序。或者你可以在你的DataTemplate指定處理程序UIElement.KeyUp或什麼:

<CheckBox IsChecked="{Binding IsChecked}" UIElement.KeyUp="..."/> 
3

您也可以綁定一個ListBoxItem的複選框,並IsSelected屬性的器isChecked屬性:

<ListBox> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding DisplayText}" IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+1

這就是我一開始的方式。缺點是複選框狀態被綁定到列表控件選擇狀態,這對於包含複選框的列表控件來說不是正常行爲。 – 2008-09-25 17:26:17

2

在您的使用情況下,使用ItemsControl而不是列表框會更簡單。一個ItemsControl類似於一個Listbox,除了它不包含自動選擇行爲。這意味着使用它來託管基本複選框的列表非常簡單,您無需解決ListBox的選擇行爲。

簡單地切換到ItemsControl中會給你你需要的東西:

<ItemsControl Style="{StaticResource CheckBoxListStyle}" Name="EditListBox"> 
    <ItemsControl .ItemTemplate> 
     <DataTemplate> 
      <CheckBox Click="Checkbox_Click" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Content="{Binding Path=DisplayText}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

您可以點擊文本檢查複選框(默認行爲),你可以使用鍵盤也不必線了任何事件處理程序。