簡體   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