How to: WPF EventSetter Handler Code NOT in CodeBehind

80 Views Asked by At

I have a WPF DataGrid with RowHeader-Style. My Objective is to add a new row when the RowHeader is clicked.

This works:

<DataGrid.RowHeaderStyle>
    <Style TargetType="{x:Type DataGridRowHeader}" BasedOn="{StaticResource MahApps.Styles.DataGridRowHeader}">
        <Setter Property="Content" Value="{Binding Path=Id, Mode=OneWay, FallbackValue=*}" />
        <EventSetter Event="Click" Handler="DataGridRowHeader_Click"/>
    </Style>
</DataGrid.RowHeaderStyle>

With handler in code behind:

private void DataGridRowHeader_Click(object sender, RoutedEventArgs e)
{
    if (sender is DependencyObject @object)
    {
        var dataGrid = DependencyObjectHelpers.FindVisualParent<DataGrid>(@object);
        if (dataGrid?.ItemsSource is IList list)
        {
            var type = list.GetType().GetGenericArguments()[0];
            var instance = Activator.CreateInstance(type);
            var position = list.Add(instance);
            EventHandler handler = null!;
            handler = (s, ea) =>
            {
                if (dataGrid.SelectedIndex != position)
                {
                    dataGrid.SelectedIndex = position;
                    dataGrid.LayoutUpdated -= handler;
                }
            };
            dataGrid.LayoutUpdated += handler;
        }
    }
}

How do I get this working code out of code behind into something like a markup extension, derived setter, attached property or something else? And NOT into the viewmodel, because the handling method has direct reference to the datagrid.

Thanks for any suggestions or solutions.

0

There are 0 best solutions below