C#如何检查listview上的所有复选框

时间:2015-01-25 12:53:59

标签: c# .net xaml checkbox

如何查看listview上的所有复选框?

Listview xaml:

<ListView x:Name="List" HorizontalAlignment="Left" Height="559" Margin="10,10,0,0" VerticalAlignment="Top" Width="607" Grid.ColumnSpan="2" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Auto" IsMouseCapturedChanged="List_IsMouseCapturedChanged">
        <ListView.ContextMenu>
            <ContextMenu>
                <MenuItem Name="Dodaj" Header="Dodaj" Click="DodajUtwor_Click"/>
                <MenuItem Name="Usuń" Header="Usuń Zaznaczone" Click="UsuńUtwór_Click"/>
                <MenuItem Name="Clear" Header="Wyczyść Listę" Click="ClearList_Click"/>
                <MenuItem Name="Check" Header="Zaznacz Wszystkie" Click="SelectAll_Click"/>
            </ContextMenu>
        </ListView.ContextMenu>            
        <ListView.View>
            <GridView>
                <GridViewColumn Width="30" >
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <CheckBox Name="CheckBox" Padding="10" IsChecked="{Binding IsChecked}"/>                           
                                <TextBlock Text="{Binding Data}"/>
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Nazwa Pliku" Width="100" DisplayMemberBinding="{Binding Nazwa}" />
                <GridViewColumn Header="Tytuł" Width="100" DisplayMemberBinding="{Binding Tytuł}"/>
                <GridViewColumn Header="Wykonawca" Width="100" DisplayMemberBinding="{Binding Autor}"/>
                <GridViewColumn Header="Album" Width="100" DisplayMemberBinding="{Binding Album}"/>
                <GridViewColumn Header="Nr" Width="100" DisplayMemberBinding="{Binding Nr}"/>
                <GridViewColumn Header="Rok" Width="100" DisplayMemberBinding="{Binding Rok}"/>
                <GridViewColumn Header="Gatunek" Width="100" DisplayMemberBinding="{Binding Gatunek}"/>
                <GridViewColumn Header="Komantarze" Width="100" DisplayMemberBinding="{Binding Komentarze}"/>
                <GridViewColumn Header="Okładka" Width="100" DisplayMemberBinding="{Binding Okładka}"/>
                <GridViewColumn Header="Lokalizacja" Width="100" DisplayMemberBinding="{Binding Lokalizacja}"/>
            </GridView>
        </ListView.View>

    </ListView>

代码:

private void Button_Click(object sender, RoutedEventArgs e)
        {
            MyItem selectedItem = (MyItem)this.List.SelectedItem;
            selectedItem.IsChedked = true;
            List.Items.Refresh();


        }

不要工作。 我想在listviev中更改true的所有复选框。我不知道如何使用循环foreach。以及如何删除项目复选框上的true?

1 个答案:

答案 0 :(得分:0)

我猜你可能会在标题栏中找一个复选框,并在选中标题复选框时选择所有网格项。

我们可以通过简单的子/子视图模型来做到这一点。下面的代码可能有助于/解决您的问题。

Xaml /查看代码 -

<GridViewDataColumn DataMemberBinding="{Binding IsChecked}"  >
            <GridViewDataColumn.Header >
              <CheckBox HorizontalAlignment="Left" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewDataControl}}
                                                ,Path=DataContext.CheckAll}"
                        Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewDataControl}}
                                                ,Path=DataContext.CheckAllCommand}"
                        CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}"  />
            </GridViewDataColumn.Header>
            <GridViewDataColumn.CellTemplate>
              <DataTemplate>
            <StackPanel Orientation="Horizontal">
                        <CheckBox Name="CheckBox" Padding="10" IsChecked="{Binding IsChecked}" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewDataControl}}
                                                ,Path=DataContext.ItemCommand}" CommandParameter="{Binding}"/>
                        <TextBlock Text=y"{Binding Data}"/>
                    </StackPanel>
              </DataTemplate>
            </GridViewDataColumn.CellTemplate>
          </GridViewDataColumn>

您可以按照以下说明使用您的视图模型。

class MainViewModel : Common.UserInterface.ViewModelBase, IDisposable
{
    public MainViewModel()
    {
        CheckAllCommand = new DelegateCommand<bool>(OnCheckAllExecuted);
    }

    void OnCheckAllExecuted(bool status)
    {
        // Your logic goes here (if any)    
        CheckAll = items.All(item => item.IsChecked);
    }

    public DelegateCommand<ItemViewModel> ItemCommand { get; private set; }

    private bool checkAll;
    private ObservableCollection<ItemViewModel> items;

    public DelegateCommand<bool> CheckAllCommand
    {
         get;
         private set;
    }

    public ObservableCollection<ItemViewModel> Items
    {
         get
         {
             return items;
         }
         set
         {
             items = value;
             OnPropertyChanged(() => Items); 
         }
     }


     public bool CheckAll
     {
         get { return checkAll; }
         set
         {
             checkAll = value;
             OnPropertyChanged(() => CheckAll);
         }
     }
}

class ItemViewModel : ViewModelBase 
{   
     public bool ischecked;
     public string data;

     public new bool IsChecked
     {
         get { return isChecked; }
         set
         {
             isChecked = value;
             OnPropertyChanged("IsChecked");
         }
     }

     public string Data
     {
         get { return data; }
         set
         {
             data = value;
             OnPropertyChanged("Data");
         }
     }
}