The trick is to use an extra property, decorate it with [Browsable(false)] and [RuleFromBoolProperty]
[NonPersistent] [ModelDefault("DisplayFormat", "{0:g}")] [ModelDefault("EditMask", "g")] [ModelDefault("Caption", "Start")] [RuleRequiredField("KlantMelding.Start.Required", DefaultContexts.Save, "Voer de start/aanvangstijd in")] [VisibleInDetailView(false)] public DateTime Start { get => _startdatum + _starttijd; set { StartDatum = value.Date; StartTijd = value.TimeOfDay; } } [Browsable(false)] [RuleFromBoolProperty("Storing.StartTimeValid", DefaultContexts.Save, "De start/aanvangstijd moet in het verleden liggen")] public bool StartTimeValid => Start < DateTime.Now; // 2nd example: [Association("KlantMelding-Klant")] [ModelDefault("Caption", "Klanten")] [DataSourceProperty("BeschikbareKlanten")] [DataSourceCriteria("DebiteurStatus != 7 && !IsNull(Relatie)")] public XPCollection<Klant> Klanten => GetCollection<Klant>(nameof(Klanten)); [Browsable(false)] [RuleFromBoolProperty("KlantMelding.Klanten.Required", DefaultContexts.Save, "Er moet minimaal 1 klant worden geselecteerd")] public bool KlantenValid => Klanten.Count() > 0;
768500cookie-checkDevExpress XAF / XPO Custom Validation