代码之家  ›  专栏  ›  技术社区  ›  Talha Talip Açıkgöz

如何检查ItemsControl中的所有文本框是否有效

  •  1
  • Talha Talip Açıkgöz  · 技术社区  · 7 年前

    我有一个itemscontrol的模板:

    <DataTemplate DataType="{x:Type models:StringParameter}">
             <TextBox materialDesign:HintAssist.Hint="{Binding Name}">
                 <TextBox.Text>
                     <Binding Path="Value">
                         <Binding.ValidationRules>
                             <ınteractiveCode:NotEmptyValidationRule ValidatesOnTargetUpdated="True"></ınteractiveCode:NotEmptyValidationRule>
                         </Binding.ValidationRules>
                     </Binding>
                 </TextBox.Text>
             </TextBox>
         </DataTemplate>
    

    我有一个与命令一起工作的按钮,我希望在ItemsControl中满足所有验证时启用它。但我找不到一种方法来访问数据模板中的文本框。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Vimal CK    7 年前

    ValidationChecker 类,该类将使用检查是否存在验证错误 IsValid 方法

    public class ValidationChecker : Freezable
    {
        public static List<DependencyObject> elements = new List<DependencyObject>();
    
        public static int GetValidationObject(DependencyObject obj)
        {
            return (int)obj.GetValue(ValidationObjectProperty);
        }
    
        public static void SetValidationObject(DependencyObject obj, int value)
        {
            obj.SetValue(ValidationObjectProperty, value);
        }
    
        // Using a DependencyProperty as the backing store for ErrorCount.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ValidationObjectProperty =
            DependencyProperty.RegisterAttached("ValidationObject", typeof(DependencyObject), typeof(ValidationChecker), new PropertyMetadata(null, OnValueChanged));
    
    
        public static bool IsValid()
        {
            foreach (var item in elements)
            {
                if (Validation.GetHasError(item)) return false;
            }
            return true;
        }
    
        private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            elements.Add(d);
        }
    
        protected override Freezable CreateInstanceCore()
        {
            return new ValidationChecker();
        }
    }
    

    ValidationObject

    <DataTemplate>
        <TextBox local:ValidationChecker.ValidationObject="{Binding RelativeSource={RelativeSource Self}}">
             <TextBox.Text>
                 <Binding Path="Value">
                     <Binding.ValidationRules>
                          <local:NotEmptyValidationRule ValidatesOnTargetUpdated="True"></local:NotEmptyValidationRule>
                     </Binding.ValidationRules>
                  </Binding>
              </TextBox.Text>
           </TextBox>
    </DataTemplate>
    

    您已经提到您的 Button 已绑定到 Command . 所以实施 CanExecute 方法 ValidationChecker.Isvalid() . 别忘了调用 RaiseCanExecute 此方法 命令 只要你需要。