WPF数据表格 - 如何订阅单元格加载事件?

3
我希望能够在代码后端修改datagrid单元格的布局,当单元格加载后。我知道可以订阅DataGrid.Load或DataGrid.LoadingRow事件,但我希望有一种方法可以订阅特定单个单元格的加载事件,以便实现更清晰。在文档中,似乎单元格类具有该事件(从FrameworkElement继承),但我找不到一种干净的订阅事件的方法。我正在使用DataGridTemplateColumn,我认为在XAML(CellTemplate)中做这件事应该很容易。
<DataGridTemplateColumn Header="ATTENDEES" Width="*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding Path=attendees}" x:Name="AttendeesItemsControl"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

谢谢!

1个回答

4
您可以使用 DataGridColumn.CellStyleEventSetter 来实现这一点:
<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <EventSetter Event="Loaded" Handler="CellLoaded" />
        </Style>
    </DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn>

在代码后台:

private void CellLoaded(object sender, EventArgs e)
{
    var cell = (DataGridCell)sender;
    ...
}

关于“Initialized”事件怎么样?我做了同样的事情:<EventSetter Event="Initialized" Handler="CellLoaded" />,它标记了“Initialized”,该事件不是路由元素。 - KHL
1
@KhalilLazhar 好的,正如错误信息所述,“Initialized”不是“RoutedEvent”,因此不能与“EventSetter”一起使用。我不确定是否有简单的方法可以订阅“DataGridCell”的该事件。无论如何,我认为这不是一个好主意,因为该事件仅触发一次,而“DataGridCell”可以作为各种单元格值的容器,因为当启用虚拟化时可能会被重复使用。 - Grx70
是的,这就是我想要的,一个只会触发一次的事件,你对订阅有什么想法吗?谢谢。 - KHL
1
在快速查看了 源代码 后,我不认为有一个简单的方法可以实现这个。然而,作为一种解决方法,你可以注册一个 Loaded 处理程序,并在其内部取消注册(通过取消订阅来实现) - 这样它只会被调用一次。除此之外,我就没什么帮助了。 - Grx70

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接