Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过命令(MVVM)选择ListView中的所有项目_C#_Wpf_Listview_Mvvm_Command - Fatal编程技术网

C# 通过命令(MVVM)选择ListView中的所有项目

C# 通过命令(MVVM)选择ListView中的所有项目,c#,wpf,listview,mvvm,command,C#,Wpf,Listview,Mvvm,Command,我的窗口中有4个ListView,每个ListView都有一个复选框列,如下所示: 现在我想实现一个命令,我可以将它绑定到我拥有的每个ListView标题中的复选框。因此,如果单击标题中的复选框,它将选择该列表视图中的所有项目,如果再次单击,它将再次取消选择所有项目 我知道通过代码隐藏中的点击事件很容易做到这一点,但我不认为这符合MVVM,是吗 但我也不想在我的ViewModel中有4个不同的“IsSelected”属性,我可以像这篇文章中建议的那样绑定到listview的样式: 还有别的办法

我的窗口中有4个ListView,每个ListView都有一个复选框列,如下所示:

现在我想实现一个命令,我可以将它绑定到我拥有的每个ListView标题中的复选框。因此,如果单击标题中的复选框,它将选择该列表视图中的所有项目,如果再次单击,它将再次取消选择所有项目

我知道通过代码隐藏中的点击事件很容易做到这一点,但我不认为这符合MVVM,是吗

但我也不想在我的ViewModel中有4个不同的“IsSelected”属性,我可以像这篇文章中建议的那样绑定到listview的样式:

还有别的办法吗?是否可以将ListView控件作为命令参数发送

我试过:

  <ListView x:Name="UserDemandListView" Grid.Column="2" Grid.Row="2" MinWidth="200" ItemsSource="{Binding DemandLicenses}" Grid.RowSpan="2">
         <ListView.View>
              <GridView>
                  <!--<SnippetGridViewColumnCheckBox>-->
                    <GridViewColumn CellTemplate="{StaticResource FirstCell}" Width="25">
                       <CheckBox x:Name="CheckAll3" Content="" Command="{Binding SelectAllCommand}" CommandParameter="{Binding ElementName=UserDemandListView}" Margin="4,0,0,0"/>
                    </GridViewColumn>
                    <!--</SnippetGridViewColumnCheckBox>-->


但是我的命令中的参数总是空的。我想我的WPF技能有点生疏了…

你应该在
DemandLicenses
中设置绑定到行级
复选框的对象属性

XAML

<ListView x:Name="UserDemandListView" Grid.Column="2" Grid.Row="2" MinWidth="200" ItemsSource="{Binding DemandLicenses}" Grid.RowSpan="2">
    <ListView.View>
        <GridView>
            <!--<SnippetGridViewColumnCheckBox>-->
            <GridViewColumn CellTemplate="{StaticResource FirstCell}" Width="25">
                <CheckBox x:Name="CheckAll3" Content=""  Margin="4,0,0,0" Checked={Binding CheckAllDemandLicenses}"/>
            </GridViewColumn>
            <!--</SnippetGridViewColumnCheckBox>-->
这样,您就不必将命令绑定到
复选框,也不必从ViewModel访问视图元素。

快速且脏

private void chkAll_Checked(object sender, RoutedEventArgs e)
    {
        if ((sender as CheckBox).Name == "chkMailAll")
            foreach (SupEquipementViewModel c in _dataGrid.ItemsSource)
                c.EnvoiMail = 1;

        if ((sender as CheckBox).Name == "chkActiveAll")
            foreach (SupEquipementViewModel c in _dataGrid.ItemsSource)
                c.Actif = 1;

        if ((sender as CheckBox).Name == "chkRemoveAll")
            foreach (SupEquipementViewModel c in _dataGrid.ItemsSource)
                c.Supprime = 1;
    }
使用xaml

<DataGridTemplateColumn Width="Auto" CanUserSort="True" CanUserResize="True">
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="chkMailAll" Content="{DynamicResource String.EquipmentView.CheckEnvoiMail}"
                                  Checked="chkAll_Checked" Unchecked="chkAll_Unchecked" />
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding EnvoiMail,UpdateSourceTrigger=PropertyChanged}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Width="Auto" CanUserSort="True" CanUserResize="True">
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="chkActiveAll" Content="{DynamicResource String.EquipmentView.CheckActif}"
                                  Checked="chkAll_Checked" Unchecked="chkAll_Unchecked" />
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding Actif,UpdateSourceTrigger=PropertyChanged}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Width="Auto" CanUserSort="True" CanUserResize="True">
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="chkRemoveAll" Content="{DynamicResource String.EquipmentView.CheckDeleted}"
                                  Checked="chkAll_Checked" Unchecked="chkAll_Unchecked" />
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding Supprime,UpdateSourceTrigger=PropertyChanged}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>


复选框绑定到DemandLicence的哪个属性?如果您将参数绑定到“DemandLicenses”,那么您可以迭代viewmodel并选择它们?@RomanoZumbé它还没有绑定到任何属性,因为我还不需要绑定它。这对我来说似乎不是很MVVM。如果复选框未绑定到任何属性,则只能通过直接与它交互来设置其选中状态。这不是MVVMapproach@GCamel好主意!但是我的“DemandLicenses”没有属性“isSelected”,我可以设置为true或者类似的,但是我可以为它添加一个属性。是的,但这正是我不想做的。因为我有4个不同的列表视图,然后我需要有4个不同的属性。我的意思是,如果没有其他解决方案,我将不得不这样做。但我希望有更好的办法。还是我理解你错了?
<DataGridTemplateColumn Width="Auto" CanUserSort="True" CanUserResize="True">
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="chkMailAll" Content="{DynamicResource String.EquipmentView.CheckEnvoiMail}"
                                  Checked="chkAll_Checked" Unchecked="chkAll_Unchecked" />
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding EnvoiMail,UpdateSourceTrigger=PropertyChanged}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Width="Auto" CanUserSort="True" CanUserResize="True">
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="chkActiveAll" Content="{DynamicResource String.EquipmentView.CheckActif}"
                                  Checked="chkAll_Checked" Unchecked="chkAll_Unchecked" />
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding Actif,UpdateSourceTrigger=PropertyChanged}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Width="Auto" CanUserSort="True" CanUserResize="True">
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="chkRemoveAll" Content="{DynamicResource String.EquipmentView.CheckDeleted}"
                                  Checked="chkAll_Checked" Unchecked="chkAll_Unchecked" />
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding Supprime,UpdateSourceTrigger=PropertyChanged}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>