Search code examples
wpfvalidationbuttondatagridmultidatatrigger

Disable/enable button with DataGridTextColumn validation


I have this DataGrid:

<DataGrid ItemsSource="{Binding CustomerXml}" 
     Name="customersDataGrid" AutoGenerateColumns="False" DataContext="{Binding}">
     <DataGrid.Columns>
         <DataGridTextColumn Header="Name">
             <DataGridTextColumn.Binding>
                 <Binding Path="Name" ValidatesOnDataErrors="True" 
                     UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
                     <Binding.ValidationRules>
                         <local:NameValidationRule/>
                     </Binding.ValidationRules>
                 </Binding>
             </DataGridTextColumn.Binding>
         </DataGridTextColumn>

         ...

     </DataGrid.Columns>          
 </DataGrid>

and I'm trying disabling and enabling save button by ValidationRule result.

<Button Content="Save" Name="save" Click="save_Click">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="IsEnabled" Value="false" />
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition 
                             Binding="{Binding ElementName=customersDataGrid, 
                             Path=(Validation.HasError)}" Value="false" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="IsEnabled" Value="true" />
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

But if the ValidationResult is set to true or false, button is still disabled.


Solution

  • So I found solution:

        int count = 0;
    
        private void customersDataGrid_Error(object sender, ValidationErrorEventArgs e)
        {
            if (e.Action == ValidationErrorEventAction.Added)
            {
                save.IsEnabled = false;
                count++;
            }
            if (e.Action == ValidationErrorEventAction.Removed)
            {
                count--;
                if (count == 0) save.IsEnabled = true;
            }
        }