C# WPF:绑定到验证规则';依附财产
我想根据标准规则验证文本框值,其中两个是最小值和最大值。问题是,我需要配置这个值(例如在设置文件中) 我有一个验证规则:C# WPF:绑定到验证规则';依附财产,c#,wpf,data-binding,dependency-properties,C#,Wpf,Data Binding,Dependency Properties,我想根据标准规则验证文本框值,其中两个是最小值和最大值。问题是,我需要配置这个值(例如在设置文件中) 我有一个验证规则: public class TextBoxWithIntegerValidation : ValidationRule { private Int32RangeChecker _validRange; public Int32RangeChecker ValidRange { get { retu
public class TextBoxWithIntegerValidation : ValidationRule
{
private Int32RangeChecker _validRange;
public Int32RangeChecker ValidRange
{
get { return _validRange; }
set { _validRange = value; }
}
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var str = value as string;
if (str == null)
{
return new ValidationResult(false, Resources.TextResources.TextBoxIsEmpty_ErrorMessage);
}
int intValue = -1;
if (!int.TryParse(str, out intValue))
{
return new ValidationResult(false, Resources.TextResources.TextBoxNotIntegerValue_ErrorMessage);
}
if (intValue < ValidRange.Minimum)
{
return new ValidationResult(false,
string.Format(Resources.TextResources.TextBoxValueLowerThanMin_ErrorMessage, ValidRange.Minimum));
}
return new ValidationResult(true, null);
}
}
和文本框验证:
<TextBox>
<TextBox.Text>
<Binding Path="Interval" UpdateSourceTrigger="PropertyChanged" ValidatesOnNotifyDataErrors="True">
<Binding.ValidationRules>
<validationRules:TextBoxWithIntegerValidation>
<validationRules:TextBoxWithIntegerValidation.ValidRange>
<validationRules:Int32RangeChecker
Minimum="{Binding IntervalMinValue}"
/>
</validationRules:TextBoxWithIntegerValidation.ValidRange>
</validationRules:TextBoxWithIntegerValidation>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
文本框放在UserControl中,相应的ViemModel放在control DataContext中
问题是:属性IntervalMinValue未绑定到验证规则。如果我手动设置,效果很好,但与绑定无关。问题在于Int32RangeChecker对象附加到一个不属于可视树的对象,因此无法访问视图模型。如果查看输出窗口,您将看到此错误
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IntervalMinValue; DataItem=null; target element is 'Int32RangeChecker' (HashCode=32972388); target property is 'Minimum' (type 'Int32')
要解决此问题,需要将最小属性的绑定连接到可视化树的元素。一种方法是添加一个不可见的伪元素并绑定到它的数据上下文
<FrameworkElement x:Name="dummyElement" Visibility="Hidden"/>
<TextBox>
<TextBox.Text>
<Binding Path="Interval" UpdateSourceTrigger="PropertyChanged" ValidatesOnNotifyDataErrors="True">
<Binding.ValidationRules>
<local:TextBoxWithIntegerValidation>
<local:TextBoxWithIntegerValidation.ValidRange>
<local:Int32RangeChecker
Minimum="{Binding Source={x:Reference dummyElement}, Path=DataContext.IntervalMinValue}"
/>
</local:TextBoxWithIntegerValidation.ValidRange>
</local:TextBoxWithIntegerValidation>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
问题在于Int32RangeChecker对象附加到不属于可视树的对象,因此无法访问视图模型。如果查看输出窗口,您将看到此错误
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IntervalMinValue; DataItem=null; target element is 'Int32RangeChecker' (HashCode=32972388); target property is 'Minimum' (type 'Int32')
要解决此问题,需要将最小属性的绑定连接到可视化树的元素。一种方法是添加一个不可见的伪元素并绑定到它的数据上下文
<FrameworkElement x:Name="dummyElement" Visibility="Hidden"/>
<TextBox>
<TextBox.Text>
<Binding Path="Interval" UpdateSourceTrigger="PropertyChanged" ValidatesOnNotifyDataErrors="True">
<Binding.ValidationRules>
<local:TextBoxWithIntegerValidation>
<local:TextBoxWithIntegerValidation.ValidRange>
<local:Int32RangeChecker
Minimum="{Binding Source={x:Reference dummyElement}, Path=DataContext.IntervalMinValue}"
/>
</local:TextBoxWithIntegerValidation.ValidRange>
</local:TextBoxWithIntegerValidation>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
如果需要可配置的Min
和Max
,请让它们查看模型属性以及Value
。是的,它们在虚拟机中。但是我无法将VM属性绑定到验证最小值、最大DPs。如果需要可配置的Min
和Max
,请让它们查看模型属性以及值。是的,它们在VM中。但我无法将VM属性绑定到验证最小值、最大DPs。非常感谢。花了几个小时绕着它跳舞,最后!令人惊叹的。非常感谢。花了几个小时绕着它跳舞,最后!