Bind a validation rule to a datagrid cell.

RONALD BEAUMAN 81 Reputation points
2021-07-03T18:01:30.233+00:00

I am attempting to associate a validation rule to a WPF DataGrid cell. The XAML interpreter indicates that the validation rule doesn't exist. Could you please tell me what I am doing wrong? Code sample follows.

XAML:

            <DataGridTextColumn DisplayIndex="2" Header="          Debit Amount/%" Width="130" IsReadOnly="false">
                <DataGridTextColumn.Binding>
                    <Binding Path="dramount" NotifyOnTargetUpdated="True" UpdateSourceTrigger="PropertyChanged" 
             Mode="TwoWay" StringFormat="{}{0:N2}}">
                        <Binding.ValidationRules>
                            <data:DrAmtValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </DataGridTextColumn.Binding>
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="HorizontalAlignment" Value="Right" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>

c#:

    public class DrAmtValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            if (value != null)
            {
                double proposedValue;

                if (!double.TryParse(value.ToString(), out proposedValue))
                {
                    return new ValidationResult(false, "Response is invalid.");
                }

                if (proposedValue < 0.00)
                {
                    return new ValidationResult(false, "Value must be zero or greater.");
                }

                return new ValidationResult(true, null);
            }
            else
            {
                return new ValidationResult(false, "Entry is required.");
            }
        }
    }
Developer technologies Windows Presentation Foundation
0 comments No comments
{count} votes

Accepted answer
  1. Emon Haque 3,176 Reputation points
    2021-07-03T19:42:35.993+00:00

    Do people pass Journal with DataGrid? What I've seen is they usually make a form with some ComboBox, for Control/Sub heads, and TextBox, for amount, to take input. Anyway, here's how you can do the Validation in DataGrid. Have something like these in XAML:

    <DataGrid ItemsSource="{Binding Entries}"  
                AutoGenerateColumns="False">  
        <DataGrid.Columns>  
            <DataGridTextColumn Header="Dr Head"/>  
            <DataGridTextColumn Header="Cr Head"/>  
            <DataGridTextColumn Header="Dr Amount" x:Name="dramount">  
                <DataGridTextColumn.Binding>  
                    <Binding Path="DrAmount"   
                                NotifyOnTargetUpdated="True"   
                                UpdateSourceTrigger="PropertyChanged"   
                                Mode="TwoWay"   
                                StringFormat="N2"  
                                ValidatesOnDataErrors="True">  
                        <Binding.ValidationRules>  
                            <local:DrAmtValidationRule />  
                        </Binding.ValidationRules>  
                    </Binding>  
                </DataGridTextColumn.Binding>  
                <DataGridTextColumn.EditingElementStyle>  
                    <Style TargetType="TextBox">  
                        <Style.Triggers>  
                            <Trigger Property="Validation.HasError" Value="true">  
                                <Setter Property="ToolTip" Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={RelativeSource Self}}"/>  
                            </Trigger>  
                        </Style.Triggers>  
                    </Style>  
                </DataGridTextColumn.EditingElementStyle>  
            </DataGridTextColumn>  
            <DataGridTextColumn Header="Cr Amount"/>  
        </DataGrid.Columns>  
    </DataGrid>  
    

    and these in ViewModel, in this case MainWindow.xaml.cs:

    public partial class MainWindow : Window  
    {  
        public ObservableCollection<Entry> Entries { get; set; }  
        public MainWindow() {  
            InitializeComponent();  
            Entries = new ObservableCollection<Entry>();  
            DataContext = this;  
        }  
    }  
    
    public class Entry  
    {  
        public string DrHead { get; set; }  
        public string CrHead { get; set; }  
        public int? DrAmount { get; set; }  
        public int? CrAmount { get; set; }  
    }  
    
    public class DrAmtValidationRule : ValidationRule  
    {  
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) {  
            double proposedValue;  
            string input = value.ToString();  
            if (input == string.Empty) return new ValidationResult(false, "Entry is required.");  
            if (!double.TryParse(input, out proposedValue)) return new ValidationResult(false, "Response is invalid.");  
            if (proposedValue < 0.00) return new ValidationResult(false, "Value must be zero or greater.");  
            return new ValidationResult(true, null);  
        }  
    }  
    

    You'll see something like this in runtime:

    111469-test.gif

    If you're interested in BookKeeping and Accounting, here's one of my Projects that takes input on a form, creates necessary Journals based on the input and I also have some basic reporting there (Balance Sheet, Income Statement, Cash Flow, Receipt Payment, Control Ledger, Ledger, etc.). It'll give you the basic idea of Book Keeping and Accounting.


0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.