I have a DataGrid with a delete button for each row, hooked to the Delete command. The button needs to be clicked twice to delete the row, which is not what I would like.
According to Snoop the button's IsEnabled == false
initially, the first click enables it. This would seem to be the problem, so how can I make the button enabled before the user clicks?
I tried using a trigger to change IsEnabled
, this is commented out in the code below, it didn't work.
Window1.xaml
<Window x:Class="WpfApp1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="Window1" Height="450" Width="800">
<Grid>
<DataGrid HorizontalAlignment="Left" Height="399" Margin="10,10,0,0"
VerticalAlignment="Top" Width="772"
x:Name="dataGrid1"
ItemsSource="{Binding ProxyServers}"
CanUserAddRows="True"
CanUserDeleteRows="True"
>
<DataGrid.Columns>
<DataGridTemplateColumn Width="SizeToCells">
<DataGridTemplateColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}"
BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Button Command="DataGrid.DeleteCommand"
IsEnabled="True" x:Name="deleteButton"
Content="X">
<!-- Make the button enable on mouse over?
Didn't work.
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="IsMouseOver"
Value="true">
<Setter Property="IsEnabled"
Value="true" />
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>-->
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="IsEnabled" Value="True"/>
</Style>
</DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
Window1.xaml.cs
using System.ComponentModel;
using System.Windows;
namespace WpfApp1
{
public partial class Window1 : Window
{
BindingList<Proxy> proxyServers;
public Window1()
{
InitializeComponent();
dataGrid1.DataContext = this;
proxyServers = new BindingList<Proxy>();
proxyServers.Add(new Proxy() { LocalURL = "http://localhost" });
}
public BindingList<Proxy> ProxyServers { get => proxyServers; set => proxyServers = value; }
}
public class Proxy
{
string localURL;
public string LocalURL { get => localURL; set => localURL = value; }
}
}
Have you considered something more like:
<DataGridTemplateColumn Header="Delete">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Command="{Binding Deletecommand}"
You could use relativesource if you want the command in the parent view's daracontext. Pass the bound row object with commandparameter.