DataGrid单行复选框正在选择所有行

时间:2019-11-19 15:04:21

标签: c# wpf checkbox

我遇到了在每行实现一个复选框的问题。发生的事情是,当我单击单个复选框时,它将选中/取消选中我的数据网格中的所有其他复选框。我认为可能正在发生的事情是我正在重新创建一个具有相同默认ID的复选框。也许。

这是我的xaml,以及我如何用问题列创建数据网格:

<DataGrid
            ItemsSource="{Binding Pets, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
            SelectedItem="{Binding SelectedPet, Mode=TwoWay}"
            AutoGenerateColumns="False"
                HorizontalAlignment="Left"
                BorderThickness="1"
                CanUserAddRows="False"
                CanUserDeleteRows="False"
                RowHeaderWidth="0"
                MinRowHeight = "25"
                ColumnHeaderHeight="30"
                HorizontalGridLinesBrush="Black"
                VerticalGridLinesBrush="Black"
                Foreground="Black" 
                CanUserSortColumns="True"
                SelectionMode="Single"
                RowStyle="{Binding Mode=OneWay, Source={StaticResource DefaultRowStyle}}">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Selection" SortMemberPath="Station" MinWidth="20">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" >
                                <CheckBox IsChecked="{Binding Path=DataContext.IsPetChecked, RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/>
                                <TextBlock Text="{Binding PetName, Mode=OneWay}"/>
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <!--MORE Columns below-->
            </DataGrid.Columns>
        </DataGrid>

在我的视图模型中,这就是我可观察的集合和复选框的方式

public bool IsPetChecked
{
    get
    {
        return _isPetChecked;
    }
    set
    {
        if (_isPetChecked != value)
        {
            _isPetChecked = value;
            RaisePropertyChanged(nameof(IsPetChecked));
        }
   }
}
private bool _isPetChecked = false;

/// <summary>
/// Stores the collection of pets
/// </summary>
public ObservableCollection<Pet> Pets
{
    get
    {
        return _pets;
    }
    set
    {
        _pets = value;
        RaisePropertyChanged(nameof(Pets));
    }
}
private ObservableCollection<Pet> _pets = new ObservableCollection<Pet>();

当我单击复选框时,该属性被标记为已更改,但是我看到它选中了所有其他复选框。有人可以告诉我我在做什么错吗?预先非常感谢。

1 个答案:

答案 0 :(得分:1)

您将所有CheckBoxes绑定到相同的IsPetChecked源属性。

如果您希望能够分别检查每行上的CheckBoxes,则Pet中的每个ItemsSource对象应具有自己的IsPetChecked(或{{1 }})属性,然后将其绑定,就像绑定到IsChecked属性一样:

PetName