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:
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.