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