繁体   English   中英

使用 static 方法的返回类型在 XAML 中设置自定义类型属性

[英]Setting a custom type property in XAML using a static method's return type

我是 WPF 的新手,正在尝试为文本框设置一些验证。 我正在尝试确定是否有办法通过 XAML 使用 static 方法的返回来将自定义类型设置为属性。

在我的 xaml 中,我目前有

<UserControl.Resources>
    <ObjectDataProvider
        ObjectType="{x:Type validators:StringValidator}" 
        MethodName="BasicValidator"
        x:Key="basicValidator"/>
</UserControl.Resources>

...

<TextBox x:Name="StrTextBox" Width="200" Height="50" >
  <TextBox.Text>
    <Binding Path="TestText" UpdateSourceTrigger="PropertyChanged">
      <Binding.ValidationRules>
        <local:StrValidationRule ValidatorType="{StaticResource basicValidator}"/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

在 ValidatorType="{StaticResource basicValidator}" 上引发错误

“System.Windows.Data.ObjectDataProvider”类型的 object 不能应用于需要“Validator.StringValidator”类型的属性。

ValidationRule 使用 StringValidator 属性设置

public class StrValidationRule : ValidationRule
{
    public StringValidator ValidatorType { get; set; }
    ...
}

我有一个 class 构建可以通过 static 方法访问的特定字符串验证器。 例如,我试图调用的 static 方法是 StringValidator.BasicValidator():

public class StringValidator : IValidator<string>
{
    ...
    public static StringValidator BasicValidator()
    {
        whiteList = "abcde...";
        return new StringValidator(whiteList);
    }

    public static StringValidator BinaryValidator()
    {
        whiteList = "01";
        return new StringValidator(whiteList);
    }

    public static StringValidator NumericValidator()
    {
        whiteList = "-012345...";
        return new StringValidator(whiteList);
    }
}

对于 ValidationRule,

public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
    string strValue = Convert.ToString(value);
    return ValidatorType.Validate(strValue).Match (
        Right: result => new ValidationResult(true, null),
        Left: error => new ValidationResult(false, error));
}

我曾尝试使用 x:Static,但这似乎只处理属性。 我也不确定我是否需要通过 Binding 来解决这个问题,但这条路线会弹出许多其他问题。

是否有一个我根本不知道的简单修复,或者我需要遵循不同的方法来解决这个问题?

如何将BasicValidator()更改为属性而不是“简单修复”?

这里的根本问题是ObjectDataProvider专门用作绑定源(如文档所述)。 通常,您在像您这样的情况下使用它的方式是这样的:

<local:StrValidationRule ValidatorType="{Binding Source={StaticResource basicValidator}}"/>

但是绑定的目标必须是依赖属性,而ValidatorType不是,也不能是(你必须继承ValidationRule )。 所以ObjectDataProvider在这种情况下根本不可用。

鉴于您发布的代码,您根本不清楚为什么需要 static 方法。 您可以在 XAML 中创建一个新实例,例如:

<local:StrValidationRule>
  <local:StrValidationRule.ValidatorType>
    <validators:StringValidator/>
  </local:StrValidationRule.ValidatorType>
</local:StrValidationRule>

或者只是将BasicValidator()方法设为 static 属性。

不幸的是,您的问题中没有足够的细节来提供比这更具体的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM