alielie
2025-11-24 9211ec11c112e18cd99e77f889a01110a70031ce
HMI.UI/DpUtil/FormGroupHelper.cs
@@ -1,11 +1,10 @@
using System;
using System.ComponentModel;
using HMI.Core.Util;
using Panuon.WPF.UI;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using Panuon.WPF.UI;
using Panuon.WPF.UI.Configurations;
namespace HMI.UI
namespace HMI.UI.DpUtil
{
    public class FormGroupHelper
    {
@@ -24,15 +23,14 @@
            new PropertyMetadata(false, (d, e) =>
            {
                if (!(d is FormGroup fg)) return;
                if ((bool)e.NewValue)
                if ((bool)e.NewValue && !string.IsNullOrEmpty(fg.Header?.ToString()))
                {
                    var style = Application.Current.FindResource("RequiredInputFormGroupStyle") as Style;
                    fg.Style = style;
                    var dataTemplate = Application.Current.FindResource("RequiredFormHeader") as DataTemplate;
                    fg.HeaderTemplate = dataTemplate;
                }
                else
                {
                    var style = Application.Current.FindResource("RequiredInputFormGroupStyle") as Style;
                    fg.Style = style;
                    fg.HeaderTemplate = null;
                }
            }));
@@ -52,7 +50,7 @@
            DependencyProperty.RegisterAttached("ValidateMethod", typeof(ValidateMethodDelegate), typeof(FormGroupHelper),
            new PropertyMetadata(null));
        public static bool ValidateForm(StackPanel fgPanel)
        public static bool ValidateForm(StackPanel fgPanel, Dictionary<string, object> values = null)
        {
            if (fgPanel.Children == null) return true;
            bool res = true;
@@ -60,12 +58,29 @@
            {
                if (child is FormGroup fg)
                {
                    object content = fg.Content;
                    object value = GetValidateValue(content);
                    if (GetIsRequired(fg) && string.IsNullOrEmpty(value.ToString()))
                    string fgName = fg.Name;
                    if (fg.Visibility != Visibility.Visible)
                    {
                        ClearValue(fg);
                        continue;
                    }
                    fg.ValidateResult = ValidateResult.None;
                    fg.Message = null;
                    object value;
                    if (values != null && values.ContainsKey(fgName))
                    {
                        value = values[fgName];
                    }
                    else
                    {
                        object content = fg.Content;
                        value = GetValidateValue(content);
                    }
                    if (GetIsRequired(fg) && (value == null || string.IsNullOrEmpty(value.ToString())))
                    {
                        fg.ValidateResult = ValidateResult.Error;
                        fg.Message = $"{fg.Header}不能为空";
                        fg.Message = string.Format(LangUtil.Get("App.CantBeEmpty"), fg.Header);
                        res = false;
                    }
                    else
@@ -90,10 +105,31 @@
                return elementCollection.Count > 0 ? GetValidateValue(elementCollection[0]) : null;
            if (content is TextBox tb) return tb.Text;
            if (content is CheckBox cb) return cb.IsChecked;
            if (content is ComboBox cBox) return cBox.Text;
            if (content is ComboBox cBox) return cBox.SelectedItem ?? cBox.SelectedValue ?? cBox.Text;
            if (content is Panel panel) return GetValidateValue(panel.Children);
            if (content is Panuon.WPF.UI.NumberInput numberInput) return numberInput.Value;
            if (content is PasswordBox passwordInput) return passwordInput.Password;
            return null;
        }
        private static void ClearValue(object content)
        {
            if (content == null) return;
            if (content is UIElementCollection elementCollection && elementCollection.Count > 0)
                ClearValue(elementCollection[0]);
            if (content is TextBox tb) tb.Text = null;
            if (content is CheckBox cb) cb.IsChecked = null;
            if (content is ComboBox cBox)
            {
                cBox.SelectedItem = null;
                cBox.SelectedValue = null;
                cBox.Text = null;
            }
            if (content is Panel panel) ClearValue(panel.Children);
            if (content is Panuon.WPF.UI.NumberInput numberInput) numberInput.Value = null;
            if (content is PasswordBox passwordInput) passwordInput.Password = null;
        }
    }
}