我在 SL5 中有一个数据网格,项目源是一个自定义类的列表。除一个之外的所有列都是常规的 DataGridTextColumns,除了绑定到作为数据源的类的属性之外,没有什么比这更有趣的了。但是,其中一列是包含 CheckBox 的 DataGridTemplateColumn。当复选框被选中/取消选中时,我正在尝试修改项目源中的特定底层元素。如何访问相关复选框所属的特定元素?
我的网格定义如下:
<data:DataGrid x:Name="ExceptionGrid" AutoGenerateColumns="False" CanUserSortColumns="True" Grid.Row="1" Grid.Column="0" VirtualizingStackPanel.VirtualizationMode="Recycling">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Policy" Binding="{Binding PolicyName}" />
<data:DataGridTextColumn Header="Retention" Binding="{Binding Retention,Converter={StaticResource BackupRetentionConverter}}" />
<data:DataGridTemplateColumn Header="Approved?">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding .,Converter={StaticResource ApprovalConverter}}" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="ToggleButton_OnChecked" Unchecked="ToggleButton_OnUnchecked" />
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
<data:DataGridTextColumn Header="Exception" Binding="{Binding ExceptionMessage}" />
</data:DataGrid.Columns>
为了在初始绑定时选中/取消选中复选框,我制作了一个转换器来执行此操作:
public class ApprovalConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var detail = (BackupExceptionDetail) value;
if (detail.IsApproved) return true;
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
问题是,当我的 Checked 事件触发时,发送者是 CheckBox 本身,我不知道如何获取复选框绑定到的实际数据项:
private void ToggleButton_OnChecked(object sender, RoutedEventArgs e)
{
var detail = (BackupExceptionDetail)sender; // <--- dies here, as the sender is a checkbox
detail.IsApproved = true;
}