【问题标题】:Selecting multiple Checkboxes at once一次选择多个复选框
【发布时间】:2016-02-09 14:21:35
【问题描述】:

我正在寻找一种在 WPF 中一次选择多个复选框的方法。我正在使用 MVVM 模式,没有像 PRISM 这样的进一步增强。我正在从 MySQL 数据库加载数据并将其绑定到数据网格。然后我想选择其中一些表,然后将它们添加到另一个数据网格。我想出的解决方案是动态创建复选框并将它们绑定到我的数据网格中的IsSelected 属性。

<DataGridTemplateColumn 
         Header="" 
         Width="auto" 
         CanUserResize="False" 
         CanUserReorder="False">
                  <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate>
                           <CheckBox x:Name="RadioButtonDatabase" 
                              IsChecked="{Binding IsSelected, 
                              UpdateSourceTrigger=PropertyChanged}" />
                       </DataTemplate>                                             
                 </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

好东西:它有效。坏事:必须手动单击我的 Datagrid 中的每个条目,以便为每个对象更新IsSelected。我希望看到一种解决方案,使多选成为可能(使用移位),并且可能是一个键(空格?)。也欢迎其他好的想法。互联网上的研究并没有产生令人满意的解决方案。

我不希望使用代码隐藏的答案,我试图尽可能接近严格的 MVVM。

【问题讨论】:

    标签: c# wpf checkbox mvvm


    【解决方案1】:

    您可以在 ViewModel 中为您的复选框定义 Command(因为我希望您还希望绑定在选中时反映每个数据项的 IsSelected 属性):

    <CheckBox Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}},Path=DataContext.CheckedCommand}" .../>
    

    视图模型:

       {
          CheckedCommand = new RelayCommand(() => this.CheckAllCheckboxes());           
        }
    
        public RelayCommand CheckedCommand { get; set; }
    
        public void CheckAllCheckboxes()
        {
            //set IsSelected true for all items here
        }
    

    从这里获取Relay Command

    更新: 为 datagrid 定义一个 Row 样式,它将 DataGridRow 的 IsSelected 属性绑定到模型的 any 属性,然后在命令操作中检查是否选择了行:

     <DataGrid.RowStyle>
            <Style TargetType="{x:Type DataGridRow}">
                <Setter Property="IsSelected" Value="{Binding IsRowSelected}" />
            </Style>
        </DataGrid.RowStyle>
    

    如果还想启用/禁用选择,请将此绑定添加到复选框:

    IsEnabled="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}},Path=IsSelected,Mode=OneWay}"
    

    【讨论】:

    • 我知道我可以创建一个选择所有复选框的命令。我只想选择那些当前标记的。
    • 如何标记?你如何标记它们?通过网格行选择?
    • 通过使用 shift 键,我可以一次选择多个项目。我想为所有当前选定的项目设置复选框启用,或者使用额外的按钮或按一个键。
    • 检查我更新的答案。您必须在模型类中添加一个属性以将其绑定到行的 IsSelected 属性,并在命令操作中首先检查该属性是否为真,然后仅检查该项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2022-10-14
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多