Datagrid将rowloading事件附加到项目中的所有数据网格

时间:2015-01-12 09:47:56

标签: c# wpf

我想将特定的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声明?

2 个答案:

答案 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();
    }
}