我正在开发一个 WPF 应用程序,其中有一个带有 DataGrid 的窗口。此 DataGrid 绑定到“Person”对象的集合。 “Person”对象有一个名为“IsObjSelected”的属性。 DataGrid 中的每一行的第一列都有一个复选框。此复选框的状态和行的选择应显示此属性的值。所以我需要下一个行为:
对于我的初始测试,创建一个测试应用程序。在那里,我为 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 的值。这也应该触发行选择的更改,反之亦然。但它无法正常工作。
为什么会发生这种情况以及如何解决?
您可以使用触发器来实现此行为。
你不需要这个
<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>