我想将特定的RowLoading
事件附加到项目中所有数据网格中的所有DataGrid
(其中大约有20个)。事件就是这样:
private void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = (e.Row.GetIndex() + 1).ToString();
}
我想在项目启动时附加事件,如下所示:
EventManager.RegisterClassHandler(typeof(DataGrid), DataGrid.LoadingRowEvent, new RoutedEventHandler(dataGrid_LoadingRow));
不幸的是,DataGrid.LoadingRowEvent
给出了一个错误,因为没有带有该名称的DataGrid类的事件。但是有一个具有该名称的事件,我可以手动为每个网格添加事件。
有没有办法在没有创建自定义控件的情况下执行此操作,或者在使用它的任何地方更改DataGrid声明?
答案 0 :(得分:0)
LoadingRow
事件未在WPF中实现为路由事件,因此您无法将此技巧用于EventManager
。
您不需要自定义控件。只需派生DataGrid
类:
class MyDataGrid : DataGrid
{
protected override void OnLoadingRow(DataGridRowEventArgs e)
{
base.OnLoadingRow(e);
}
}
因此,在使用MyDataGrid
代替DataGrid
课程时,您可以完全控制OnLoadingRow
中发生的事情。
答案 1 :(得分:0)
如果您的问题仅与标题中的行索引有关,则您不需要处理LoadingRow
事件。相反,您可以使用绑定到AlternationIndex属性:
<DataGrid AlternationCount="2147483647" ...>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Header"
Value="{Binding Path=(ItemsControl.AlternationIndex),
RelativeSource={RelativeSource Self},
Converter={StaticResource RowIndexConverter}}"/>
</Style>
</DataGrid.RowStyle>
</DataGrid>
您可以将其置于默认的DataGrid
样式中,以便它自动应用于所有DataGrid实例:
<Style TargetType="DataGrid">
<Setter Property="AlternationCount" Value="2147483647"/>
<Setter Property="RowStyle">
<Setter.Value>
<Style TargetType="DataGridRow">
<Setter Property="Header"
Value="{Binding Path=(ItemsControl.AlternationIndex),
RelativeSource={RelativeSource Self},
Converter={StaticResource RowIndexConverter}}"/>
</Style>
</Setter.Value>
</Setter>
</Style>
绑定转换器如下所示:
public class RowIndexConverter : IValueConverter
{
public object Convert(
object value, Type targetType, object parameter, CultureInfo culture)
{
return string.Format("{0}", (int)value + 1);
}
public object ConvertBack(
object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}