Возможно, вы захотите вместо этого выставить свое свойство ValidateMatrixFunc как событие.Зачем?это больше соответствует тому, как обычно реализованы элементы управления.Кроме того, события позволяют иметь несколько подписчиков (обработчиков событий) для одного события.Хотя это может быть и не типичный вариант использования, но иногда это происходит.
Ниже я описал, как реализовать это как событие:
Давайте назовем событие «ValidatingMatrix».
Тогда вы можете написать свою разметку ASPX следующим образом:
<uc1:MatrixTable ID="ucMatrixTable" runat="server" OnValidatingMatrix="ValidateMatrix" />
Кроме того, давайте использовать делегат CancelEventHandler
вместо Func<bool>
.Это означает, что ваша подпись метода ValidateMatrix в вашем коде должна выглядеть следующим образом:
protected void ValidateMatrix(object sender, System.ComponentModel.CancelEventArgs e)
{
// perform validation logic
if (validationFailed)
{
e.Cancel = true;
}
}
Внутри вашего пользовательского элемента управления MatrixTable реализуйте что-то вроде этого:
const string ValidatingMatrixEventKey = "ValidatingMatrix";
public event System.ComponentModel.CancelEventHandler ValidatingMatrix
{
add { this.Events.AddHandler(ValidatingMatrixEventKey, value); }
remove { this.Events.RemoveHandler(ValidatingMatrixEventKey, value); }
}
protected bool OnValidatingMatrix()
{
var handler = this.Events[ValidatingMatrixEventKey] as System.ComponentModel.CancelEventHandler;
if (handler != null)
{
// prepare event args
var e = new System.ComponentModel.CancelEventArgs(false);
// call the event handlers (an event can have multiple event handlers)
handler(this, e);
// if any event handler changed the Cancel property to true, then validation failed (return false)
return !e.Cancel;
}
// there were no event handlers, so validation passes by default (return true)
return true;
}
private void MyLogic()
{
if (this.OnValidatingMatrix())
{
// validation passed
}
else
{
// validation failed
}
}