[英]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.