![](/img/trans.png)
[英]How do I pass additional exception data to a global exception filter in C#?
[英]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类的几个属性)。
我基本上是按照以下网站上的描述进行操作。
我能够使用转换器来做到这一点。 我使用了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.