Method for validating properties based on passed conditions
The class encapsulating the two properties suggested by @eurotrash is definitely a good idea. I think name ValidationRule should be ok.

class ValidationRule
{
    public ValidationRule(Func&lt;bool&gt; predicate, string message)
    {
        Predicate = predicate;
        Message = message;
    }
    public Func&lt;bool&gt; Predicate { get; }
    public string Message { get; }
}


I'd go further and create a collection so that I can use the collection initializer to specify the rules. This means collection class must implement the IEnumerable&lt;T&gt; interface and some Add(..) method. Then we can use the syntax:

new SomeCollection
{
   Item1, Item2
}


or if the Add(..) requires more then one parameter:

new SomeCollection
{
   { Item1, Item1a },
   { Item2, Item2a },
}


so our new collection is

class ValidationRuleCollection : IEnumerable&lt;ValidationRule&gt;
{
    private readonly List&lt;ValidationRule&gt; _rules = new List&lt;ValidationRule&gt;();

    public ValidationRuleCollection Add(Func&lt;bool&gt; predicate, string message)
    {
        _rules.Add(new ValidationRule(predicate, message));
        return this;
    }

    public IEnumerator&lt;ValidationRule&gt; GetEnumerator() =&gt; _rules.GetEnumerator();

    IEnumerator IEnumerable.GetEnumerator() =&gt; GetEnumerator();
}


Then you could use it like this

var result = Validate(nameof(FilePath), new ValidationRuleCollection
{
    { () =&gt; string.IsNullOrEmpty(FilePath), "Select a file to load" },
});


You don't need the Expression for it. You're not using it here. It adds overhead but does not have any advantage in this case.



The foreach loop can be replaced with LINQ. You stop at the first true result so use the FirstOrDefault to find it.

var rule = validationRules.FirstOrDefault(x =&gt; x.Predicate());
if (rule != null)
{
    ValidationProperties[propertyName] = false;
    ValidationChangedEvent?.Invoke(this, false);
    return rule.Message;
}