一次选择多个复选框

时间:2016-02-09 01:07:06

标签: c# wpf checkbox mvvm

我正在寻找一种在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。

1 个答案:

答案 0 :(得分:1)

您可以在ViewModel中为您的复选框定义命令(因为我希望您还希望绑定以在选中时反映每个数据项的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属性绑定到Model的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}"