绑定到 WPF DataGrid 中的按钮不会更新
Binding to Button in WPF DataGrid does not update
我的 WPF 应用程序中有一个 DataGrid,其中包含包含布尔值的列。我想镜像 DataGridCheckBoxColumn 但我想将复选框更改为彩色文本框。因此,对于真值,它将显示绿色 "Pass",对于假值,它将显示红色 "Fail"。我试过设置 DataGridCheckBoxColumn.ElementStyle 和一个带有按钮的 DataGridTemplateColumn,但绑定不会更新。它们在加载时设置良好,但在项目更新时设置不正确。数据网格包含 TestPointAttempts 的集合。
这是我的模板列代码,里面有一个按钮。
<DataGridTemplateColumn Header="Talk Out" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="{Binding TalkOut, Converter={StaticResource BoolToPassFailConverter}, Mode=TwoWay}"
Foreground="{Binding TalkOut, Converter={StaticResource BoolToGreenRedConverter}, Mode=TwoWay}"
Style="{StaticResource TestResultButtonStyle}"
Click="TalkOutButton_Click"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我能够使点击事件正常工作并更新代码中的 "TalkOut" 值,但按钮文本和前景不更新。在我的视图模型中,我有更新项目的代码。我将选定的单元格作为 TestPointAttempt 并将其传递给视图模型进行更新。这是我的视图模型代码:
public void ToggleTestResult(TestPointAttempt tpa, bool inOutSwitch)
{
if (inOutSwitch)
{
tpa.TalkIn = !tpa.TalkIn;
RaisePropertyChanged(() => tpa.TalkIn);
}
else
{
tpa.TalkOut = !tpa.TalkOut;
RaisePropertyChanged(() => tpa.TalkOut);
}
}
这是我的 testPointAttempt 模型:
public class TestPointAttempt
{
public string Id { get; set; }
public int TestAttemptNumber { get; set; }
public bool? TalkIn { get; set; }
public bool? TalkOut { get; set; }
...
}
如何让单元格根据更改进行更新?
TestPointAttempt 需要实现 INotifyPropertyChanged,setter 需要触发 propertyChanged 事件。
另一种方法是使用 Fody。
我的 WPF 应用程序中有一个 DataGrid,其中包含包含布尔值的列。我想镜像 DataGridCheckBoxColumn 但我想将复选框更改为彩色文本框。因此,对于真值,它将显示绿色 "Pass",对于假值,它将显示红色 "Fail"。我试过设置 DataGridCheckBoxColumn.ElementStyle 和一个带有按钮的 DataGridTemplateColumn,但绑定不会更新。它们在加载时设置良好,但在项目更新时设置不正确。数据网格包含 TestPointAttempts 的集合。
这是我的模板列代码,里面有一个按钮。
<DataGridTemplateColumn Header="Talk Out" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="{Binding TalkOut, Converter={StaticResource BoolToPassFailConverter}, Mode=TwoWay}"
Foreground="{Binding TalkOut, Converter={StaticResource BoolToGreenRedConverter}, Mode=TwoWay}"
Style="{StaticResource TestResultButtonStyle}"
Click="TalkOutButton_Click"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我能够使点击事件正常工作并更新代码中的 "TalkOut" 值,但按钮文本和前景不更新。在我的视图模型中,我有更新项目的代码。我将选定的单元格作为 TestPointAttempt 并将其传递给视图模型进行更新。这是我的视图模型代码:
public void ToggleTestResult(TestPointAttempt tpa, bool inOutSwitch)
{
if (inOutSwitch)
{
tpa.TalkIn = !tpa.TalkIn;
RaisePropertyChanged(() => tpa.TalkIn);
}
else
{
tpa.TalkOut = !tpa.TalkOut;
RaisePropertyChanged(() => tpa.TalkOut);
}
}
这是我的 testPointAttempt 模型:
public class TestPointAttempt
{
public string Id { get; set; }
public int TestAttemptNumber { get; set; }
public bool? TalkIn { get; set; }
public bool? TalkOut { get; set; }
...
}
如何让单元格根据更改进行更新?
TestPointAttempt 需要实现 INotifyPropertyChanged,setter 需要触发 propertyChanged 事件。
另一种方法是使用 Fody。