التحقق من الصحة WPF في عنصر تحكم Elementhost
-
11-09-2019 - |
سؤال
لدي نموذج WinForms يحتوي على عنصر تحكم Elementhost (الذي يحتوي على WPF Usercontrol) وزر "حفظ".
في WPF Usercontrol، تلقيت مربع نص مع بعض التحقق من الصحة عليه. شيء من هذا القبيل...
<TextBox Name="txtSomething" ToolTip="{Binding ElementName=txtSomething, Path=(Validation.Errors).[0].ErrorContent}">
<Binding NotifyOnValidationError="True" Path="Something">
<Binding.ValidationRules>
<commonWPF:DecimalRangeRule Max="1" Min="0" />
</Binding.ValidationRules>
</Binding>
</TextBox>
كل هذا يعمل بشكل جيد. ما أريد أن أفعله، هو تعطيل الزر "حفظ" أثناء وجود النموذج في حالة غير صالحة.
سيتم تقدير أي مساعدة إلى حد كبير.
المحلول 2
حسنا، لقد عملت أخيرا حلا لمشكلتي.
في عنصر تحكم WPF أضفت هذا إلى Loaded
حدث.
Validation.AddErrorHandler(this.txtSomething, ValidateControl);
أين ValidateControl
أعلاه، يتم تعريفه على أنه:
private void ValidateControl(object sender, ValidationErrorEventArgs args)
{
if (args.Action == ValidationErrorEventAction.Added)
OnValidated(false);
else
OnValidated(true);
}
أخيرا أضفت حدثا يسمى Validated
التي تحتوي على an. IsValid
منطقية في أحداثه Args. كنت قادرا بعد ذلك في ربط هذا الحدث على النموذج الخاص بي لإخباره بأن عنصر التحكم صالح أم لا.
إذا كان هناك طريقة أفضل سأكون مهتما بالتعلم.
نصائح أخرى
أعتقد أن هذا يجب أن يساعدك:
<UserControl Validation.Error="Validation_OnError >
<UserControl.CommandBindings>
<CommandBinding Command="ApplicationCommands.Save" CanExecute="OnCanExecute" Executed="OnExecute"/>
</UserControl.CommandBindings>
...
<Button Command="ApplicationCommands.Save" />
...
</UserControl>
/* put this in usercontrol's code behind */
int _errorCount = 0;
private void Validation_OnError(object sender, ValidationErrorEventArgs e)
{
switch (e.Action)
{
case ValidationErrorEventAction.Added:
{ _errorCount++; break; }
case ValidationErrorEventAction.Removed:
{ _errorCount--; break; }
}
}
private void OnCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = _errorCount == 0;
}
ثم يمكنك إبلاغ الخط الرئيسي حول تغيير مع حدث مسجل على UserControl.