如何根据DataGrid行内复选框的状态选择/取消选择该行?

问题描述 投票:0回答:1

我正在开发一个 WPF 应用程序,其中有一个带有 DataGrid 的窗口。此 DataGrid 绑定到“Person”对象的集合。 “Person”对象有一个名为“IsObjSelected”的属性。 DataGrid 中的每一行的第一列都有一个复选框。此复选框的状态和行的选择应显示此属性的值。所以我需要下一个行为:

  1. 当我在每个地方单击“行”时 - 它应该选中复选框并使 IsObjSelected = true。
  2. 当我选中一个未选中的复选框并且它将被选中时 - 它应该选择放置此复选框的行并使 IsObjSelected = true。
  3. 当我再次检查已选中的复选框时,它将被取消选中 - 它应该取消选择放置此复选框的行并使 IsObjSelected = false。

对于我的初始测试,创建一个测试应用程序。在那里,我为 Checkbox 的 IsChecked 属性和 Row 的 IsSelected 属性创建到此属性 IsObjSelected 的绑定。它对于我的 TODO 列表的第 1 项和第 3 项正常工作。但对于第二项,它会产生奇怪的行为。当我选中并取消选中复选框时 - 它会选中并立即再次取消选中它+选择立即取消选择行。而且我也不知道为什么。

它的外观如下:

这是我的代码。 “人”类:

public class Person: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;

    public bool IsObjSelected
    {
        get => _isObjSelected;
        set
        {
            _isObjSelected = value;
            NotifyPropertyChanged(nameof(IsObjSelected));
        }
    }

    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            NotifyPropertyChanged(nameof(Name));
        }
    }

    public DateTime DateTime
    {
        get => _dateTime;
        set
        {
            _dateTime = value;
            NotifyPropertyChanged(nameof(DateTime));
        }
    }

    public Person(bool isSelected, string name, DateTime dateTime)
    {
        _isObjSelected = isSelected;
        _name = name;
        _dateTime = dateTime;
    }

    private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private bool _isObjSelected;
    private string _name;
    private DateTime _dateTime;
}

这是我的 DataGrid 窗口的一部分:

</DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="{x:Type DataGridRow}">
            <Setter Property="IsSelected" Value="{Binding IsObjSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        </Style>
    </DataGrid.RowStyle>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Selected"
                                SortDirection="Ascending"
                                Width="auto">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox HorizontalAlignment="Center" IsChecked="{Binding IsObjSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Name"
                            Binding="{Binding Name}"
                            SortDirection="Ascending"
                            Width="*"/>
        <DataGridTextColumn Header="Date and Time"
                            Binding="{Binding DateTime}"
                            SortDirection="Ascending"
                            Width="auto"/>
    </DataGrid.Columns>
</DataGrid>

因此,按照我的逻辑,检查 Checkbox 应该更改属性 IsObjSelected 的值。这也应该触发行选择的更改,反之亦然。但它无法正常工作。

为什么会发生这种情况以及如何解决?

c# wpf checkbox datagrid
1个回答
0
投票

您可以使用触发器来实现此行为。

你不需要这个

<Setter Property="IsSelected"
        Value="{Binding IsObjSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

替换为

<Style.Triggers>
    <DataTrigger Binding="{Binding IsObjSelected}" Value="True">
        <Setter Property="IsSelected" Value="True" />
    </DataTrigger>
    <DataTrigger Binding="{Binding IsObjSelected}" Value="False">
        <Setter Property="IsSelected" Value="False" />
    </DataTrigger>
</Style.Triggers>
© www.soinside.com 2019 - 2024. All rights reserved.