我使用以下示例,目前需要进行验证的列表
在验证规则类中,但现在我需要从外部获取它,并且可以在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>
答案 0 :(得分:0)
为此,您需要将列表从ViewModel
绑定到验证类,并且不幸的是,您无法以正常方式向从ValidationRule派生的类添加绑定。这是因为验证规则不在继承上下文中,并且不是从DependencyObject派生的。
使用此blog
中所述的DataSource
Techinique可以实现类似的结果
我使用过这种技术,工作得非常好。
答案 1 :(得分: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>
希望它有所帮助。这是一个我没有完全测试的想法,但希望有帮助...