簡體   English   中英

如何將其他數據傳遞到ValidationRule中?

[英]How do I pass additional data into a ValidationRule?

我有這樣創建的驗證規則:

public class TagFitsConstraintRule : ValidationRule
{
    public TagDependencyObject SelectedTag { get; set; }

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        Tag tag = SelectedTag.Tag;

        if (tag != null)
        {
            if (tag.TagConstraintPattern == null)
            {
                return ValidationResult.ValidResult;
            }
            else
            {
                // Perform additional validation for the tag
            }
        }
        else
        {
            return new ValidationResult(false, "No tag selected.");
        }
    }
}

Dependency對象定義為:

public class TagDependencyObject : DependencyObject
{
    public static readonly DependencyProperty TagProperty = DependencyProperty.Register("Tag", typeof(Tag), typeof(TagDependencyObject), new UIPropertyMetadata(null));

    public Tag Tag
    {
        get { return (Tag)GetValue(TagProperty); }
        set { SetValue(TagProperty, value); }
    }
}

我在XAML中將其用作:

<Window
...>
<Window.Resources>
    <d:TagDependencyObject x:Key="TagDependencyObject" Tag="{Binding CurrentlySelectedTag}"/>
</Window.Resources>
...
<TextBox ... >
    <TextBox.Text>
        <Binding Path="CurrentlySelectedTag" Converter="{StaticResource TagDataConverter}" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <c:TagFitsConstraintRule ValidatesOnTargetUpdated="True" SelectedTag="{StaticResource TagDependencyObject}"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
...

無論出於什么原因,我似乎都無法動腦筋,TagDependencyObject的Tag屬性不會因為設置為null而退縮。 我嘗試操縱綁定模式,UpdateSourceTrigger,似乎沒有任何效果。 我知道一個事實,因為窗口上的其他組件適當地填充了ViewModel上的屬性。 我還驗證了在運行ValidationRule之前已設置ViewModel屬性。 我究竟做錯了什么?

我故意以這樣的方式措辭這個問題,因為也許有一種更好的方法來做我不知道的事情,所以我願意接受其他選擇。 我的最終目標是對上面XAML中列出的TextBox提供驗證,但是我不僅需要TextBox中的文本來進行實際驗證(只是Tag類的幾個屬性)。

我基本上是按照以下網站上的描述進行操作。

站點1 站點2

我能夠使用轉換器來做到這一點。 我使用了IMultiValueConverter,因此可以將所需的每個屬性傳遞給轉換器。

轉換器:

public class MyCoolConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // Logic
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

捆綁:

<TextBox Text="{Binding CurrentlySelectedTag.TagData, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.Style>
        <MultiBinding Converter="{StaticResource TagDataValidationStyleSelector}" UpdateSourceTrigger="PropertyChanged">
            <Binding Path="CurrentlySelectedTag"/>
            <Binding Path="CurrentlySelectedTag.TagData" UpdateSourceTrigger="PropertyChanged"/>
        </MultiBinding>
    </TextBox.Style>
</TextBox>

驗證部分在文檔中似乎沒有得到很好的解釋……通過在驗證中設置ValidateOnDataErrors = true,從轉換器中拋出異常,您將在輸入中得到類似的紅框概述視覺錯誤。模板,它似乎是默認模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM