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.