使用静态方法的 return 类型在 XAML 中设置自定义类型 属性
Setting a custom type property in XAML using a static method's return type
我是 WPF 的新手,正在尝试为文本框设置一些验证。我正在尝试通过使用静态方法的 return.
来确定是否可以通过 XAML 将自定义类型设置为 属性
在我的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}" 上引发错误
An object of the type "System.Windows.Data.ObjectDataProvider" cannot be applied to a property that expects the type "Validator.StringValidator".
ValidationRule 使用 StringValidator 设置 属性
public class StrValidationRule : ValidationRule
{
public StringValidator ValidatorType { get; set; }
...
}
我有一个 class 可以构建可以通过静态方法访问的特定字符串验证器。例如,我要调用的静态方法是 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,但这似乎只能处理属性。我也不确定我是否需要通过绑定来解决这个问题,但这条路线会弹出许多其他问题。
是否有我根本不知道的简单修复方法,或者我需要采用不同的方法来解决这个问题?
如何将 BasicValidator()
更改为 属性 而不是“简单修复”?
这里的根本问题是 ObjectDataProvider
专门用作 绑定源 (正如 the documentation 所解释的)。通常情况下,在像你这样的情况下你会这样使用它:
<local:StrValidationRule ValidatorType="{Binding Source={StaticResource basicValidator}}"/>
但是绑定的目标必须是依赖属性,而ValidatorType
不是,也不可能是(你必须继承ValidationRule
)。所以 ObjectDataProvider
在这种情况下根本不可用。
鉴于您发布的代码,根本不清楚您为什么需要静态方法。您可以在 XAML 中创建一个新实例,例如:
<local:StrValidationRule>
<local:StrValidationRule.ValidatorType>
<validators:StringValidator/>
</local:StrValidationRule.ValidatorType>
</local:StrValidationRule>
或者只是将 BasicValidator()
方法改为静态 属性。
很遗憾,您的问题中没有足够的细节来提供比这更具体的建议。
我是 WPF 的新手,正在尝试为文本框设置一些验证。我正在尝试通过使用静态方法的 return.
来确定是否可以通过 XAML 将自定义类型设置为 属性在我的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}" 上引发错误
An object of the type "System.Windows.Data.ObjectDataProvider" cannot be applied to a property that expects the type "Validator.StringValidator".
ValidationRule 使用 StringValidator 设置 属性
public class StrValidationRule : ValidationRule
{
public StringValidator ValidatorType { get; set; }
...
}
我有一个 class 可以构建可以通过静态方法访问的特定字符串验证器。例如,我要调用的静态方法是 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,但这似乎只能处理属性。我也不确定我是否需要通过绑定来解决这个问题,但这条路线会弹出许多其他问题。
是否有我根本不知道的简单修复方法,或者我需要采用不同的方法来解决这个问题?
如何将 BasicValidator()
更改为 属性 而不是“简单修复”?
这里的根本问题是 ObjectDataProvider
专门用作 绑定源 (正如 the documentation 所解释的)。通常情况下,在像你这样的情况下你会这样使用它:
<local:StrValidationRule ValidatorType="{Binding Source={StaticResource basicValidator}}"/>
但是绑定的目标必须是依赖属性,而ValidatorType
不是,也不可能是(你必须继承ValidationRule
)。所以 ObjectDataProvider
在这种情况下根本不可用。
鉴于您发布的代码,根本不清楚您为什么需要静态方法。您可以在 XAML 中创建一个新实例,例如:
<local:StrValidationRule>
<local:StrValidationRule.ValidatorType>
<validators:StringValidator/>
</local:StrValidationRule.ValidatorType>
</local:StrValidationRule>
或者只是将 BasicValidator()
方法改为静态 属性。
很遗憾,您的问题中没有足够的细节来提供比这更具体的建议。