0

我正在使用以下示例,它当前需要进行验证的列表是

在验证规则类中,但现在我需要从外部获取它,并且可以在 RT 期间更改列表,

如何将列表从视图模型发送到验证规则类

 public class PropertVal : ValidationRule
    {
        private readonly List<String>  validValues = new List<String> { "aa", "bb", "cc", "dd" };
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if(value == null)
                return new ValidationResult(false, "The Field are not match");

            string val = value.ToString().Trim();
            bool isValid = !string.IsNullOrEmpty(val) && validValues.Contains(val);
            ValidationResult result = null;
            result = isValid
                         ? new ValidationResult(true, null)
                         : new ValidationResult(false, "The Field are not match");

            return result;
        }
    }

XAML

<TextBox>
    <TextBox.Text>
        <Binding Path="NameOfViewModelPropery" UpdateSourceTrigger="PropertyChanged"
                 >
            <Binding.ValidationRules>
                <local:PropertiesMapValidation ValidatesOnTargetUpdated="True"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
4

2 回答 2

0

为此,您需要将 List from 绑定ViewModel到您的验证类,不幸的是,您不能以正常方式将绑定添加到从 ValidationRule 派生的类的属性。这是因为验证规则不在继承上下文中,也不从 DependencyObject 派生。

DataSource如本博客所述,使用 Techinique 可以获得类似的结果

我已经使用了这种技术并且工作得非常好。

于 2014-01-29T13:22:57.197 回答
0

我有一个解决方案,但需要对其进行测试:首先您不能直接在绑定中使用属性验证,因为它会创建类的新实例,然后您不能将项目添加到验证列表中。我在 App.xaml 文件的资源库中创建了一个实例:

<Application x:Class="WpfApplicationTest.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:WpfApplicationTest="clr-namespace:WpfApplicationTest" StartupUri="MainWindow.xaml">
<Application.Resources>
    <WpfApplicationTest:PropertVal x:Key="propertVal" />
</Application.Resources>

通过这种方式,您可以从应用程序的任何部分访问它,这是我创建的 MainViewModel 类中的一个示例:

public class MainViewModel
{
    public void AddValue()
    {
        var propVal = App.Current.MainWindow.Resources["propertVal"] as PropertVal; 
        if (propVal == null)
            return;
        propVal.AddListItem("Some New Item");
    }
}

但为此,我需要在PropertVal类中创建公共方法:

public class PropertVal:ValidationRule
{
    private readonly List<String> validValues = new List<String> { "aa", "bb", "cc", "dd" };
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        if (value == null)
            return new ValidationResult(false, "The Field are not match");

        string val = value.ToString().Trim();
        bool isValid = !string.IsNullOrEmpty(val) && validValues.Contains(val);
        ValidationResult result = null;
        result = isValid
                     ? new ValidationResult(true, null)
                     : new ValidationResult(false, "The Field are not match");

        return result;
    }

    public void AddListItem(string item)
    {
        //...
    }

    public void RemoveItem(string item)
    {
        //...
    }
}

然后在 xaml 代码中使用它:

<TextBox>
        <TextBox.Text>
            <Binding Path="NameOfViewModelPropery" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <StaticResource ResourceKey="propertVal"/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

希望能帮助到你。这是一个我没有完全测试过的想法,但希望有帮助......

于 2014-01-29T13:41:16.593 回答