2011-02-28 108 views
7

我有一個WPF列表框與添加到它的複選框,並在此刻它看起來像這樣: WPF checkboxWPF列表框與複選框多個檢查

要選擇所有不同的項目,我必須點擊每個複選框一個由一個,或做一個全選(我有一個單獨的按鈕)。但如果我只想選擇一半,那很痛苦。

我想要做的是點擊一個,按住shift鍵,點擊另一個,然後點擊其中一個旁邊的複選框切換所有選中的選項。 Windows窗體允許這很容易,我想,但我不知道該怎麼做WPF?目前我已經設定只允許一次選擇一個(選擇意味着什麼,它的全部關於檢查)。

理想情況下,我也有它,所以選擇一些東西檢查它(即不必挑出小複選框,你可以點擊文字),但我認爲這可能很難做我的shift +選擇的東西。

<Window.Resources> 
    <DataTemplate x:Key="ListBoxItemTemplate" > 

     <WrapPanel> 
      <CheckBox Focusable="False" IsChecked="{Binding Selected}" VerticalAlignment="Center" /> 
      <ContentPresenter Content="{Binding Name, Mode=OneTime}" Margin="2,0" /> 
     </WrapPanel> 

    </DataTemplate> 

</Window.Resources> 

<ListBox Margin="10" HorizontalAlignment="Stretch" Name="lbSheets" 
       VerticalAlignment="Stretch" Width="Auto" Grid.Row="1" MinWidth="321" 
       MinHeight="40" HorizontalContentAlignment="Left" 
       ItemTemplate="{StaticResource ListBoxItemTemplate}" VerticalContentAlignment="Top" Background="#FFDCEBEE" SelectionMode="Single"> 

</ListBox> 

我希望這一切都有道理 - 在WPF中這樣做的最好方法是什麼?

回答

3

查看SelectionMode屬性。請注意,當在擴展模式下,你可以按住Shift鍵單擊項目組,通過點擊在ListBoxItem中的文本或CheckBox.Read下面的文章,你會得到一個更好的主意

http://www.codeproject.com/KB/WPF/WPFProblemSolving.aspx

+0

+1非常好的文章。 :) – 2011-02-28 05:03:29

+0

實際上,分開的複選框看起來很奇怪,會導致用戶混淆。 – 2011-02-28 05:25:39

+0

複選框不需要分開。您可以實現您喜歡的方式。 – biju 2011-02-28 05:34:12

-1

您需要使用擴展使用Shift選擇模式。您可以使用下面的代碼,以允許空格鍵(如列表的本地行爲)檢查所選項目:

private void listBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (!e.IsRepeat && e.Key == Key.Space) 
    { 
     bool notMixed = listBox.SelectedItems.Cast<object>().Any(item => ((yourItemsClass)item).Selected)^
         listBox.SelectedItems.Cast<object>().Any(item => !((yourItemsClass)item).Selected); 

     foreach (var item in listBox.SelectedItems) 
     { 
      yourItemsClass t = (yourItemsClass)item; 
      t.Selected = notMixed ? !yourItemsClass.Selected : true; 
     } 
    } 
} 

在這個例子中:yourItemsClass是類綁定到列表源對象。首先,你看看哪些項目已經被檢查(不是混合變量)。如果沒有選擇任何項目或選定範圍內的某些項目已被選中,則Space按下後只需檢查其餘項目。如果所有選中的項目都被選中,則全部取消選中。