سؤال

لدي نموذج 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top