user2529011
user2529011

Reputation: 733

DataGrid a single row checkbox is selecting all rows

I am having this issue implementing a checkbox per row. What happens is that when I click on a single checkbox it then checks/unchecks all other checkboxes in my datagrid. I think what may be happening is that I am recreating a checkbox with the same default id. maybe.

Here is my xaml and how I am creating my datagrid with my problem column:

<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>

In my view model this is how I have my observable collection and my checkbox

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>();

When I click on the checkbox the property is marked as changed but I am seeing it check all other checkboxes. Can someone tell me what am I doing wrong? Many thanks in advance.

Upvotes: 1

Views: 145

Answers (1)

mm8
mm8

Reputation: 169228

You bind all CheckBoxes to the same IsPetChecked source property.

If you want to be able to check the CheckBoxes on each row individually, each Pet object in the ItemsSource should have its own IsPetChecked (or IsChecked) property that you then bind to just like you bind to the PetName property:

<CheckBox IsChecked="{Binding Path=IsChecked}"/>

Upvotes: 1

Related Questions