In WPF I have created a custom control for a button.
I would like this button to become ‘enabled’ when a target datagrid has some cells selected, otherwise it should become ‘disabled’.
This is my code:
public class MyCustomButton: Button
{
public DataGrid TargetDataGrid
{
get { return (DataGrid)GetValue(TargetDataGridProperty); }
set { SetValue(TargetDataGridProperty, value); }
}
public static readonly DependencyProperty TargetDataGridProperty =
DependencyProperty.Register("TargetDataGrid", typeof(DataGrid), typeof(MyCustomButton), new PropertyMetadata(new PropertyChangedCallback(OnTargetDatagridChanged)));
private static void OnTargetDatagridChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.OldValue is DataGrid oldGrid)
{
oldGrid.SelectedCellsChanged -= DataGrid_SelectedCellsChanged;
}
if (e.NewValue is DataGrid currDg)
{
currDg.SelectedCellsChanged += DataGrid_SelectedCellsChanged;
}
}
private static void DataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
if (sender is DataGrid dg && dg.SelectedCells.Any())
{
// how can I disable/enable this button since we are in a static method?
// IsEnabled = true
}
else
{
// IsEnabled = false
}
}
}
>Solution :
Do not declare the event handler as a static method:
private static void OnTargetDatagridChanged(
DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var button = (MyCustomButton)d;
if (e.OldValue is DataGrid oldDg)
{
oldDg.SelectedCellsChanged -= button.DataGrid_SelectedCellsChanged;
}
if (e.NewValue is DataGrid newDg)
{
newDg.SelectedCellsChanged += button.DataGrid_SelectedCellsChanged;
}
}
private void DataGrid_SelectedCellsChanged(
object sender, SelectedCellsChangedEventArgs e)
{
IsEnabled = sender is DataGrid dg && dg.SelectedCells.Any();
}