System.Windows.Controls.ValidationRule 是否仅支持属性的值类型
Does System.Windows.Controls.ValidationRule only support Value Types for properties
我正在使用以下 System.Windows.ValidationRule.
public class XXXValidationRule : ValidationRule
{
public object FooObject { get; set;}
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
Bar barObject = this.FooObject.BarObject;
}
}
我的XAML显示是这样的。
<ui:Windows.Resources>
<ResourceDictionary>
<viewModel:XXXValidationRule x:key="xxxValidationRule"/>
</ResourceDictionary>
</ui:Windows.Resources>
...
<TextBox.Text>
<Binding Path="..." UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<viewModel:XXXValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
到目前为止一切顺利。现在,在我的 XAML 对话框的代码隐藏中,我按如下方式初始化 ValidationRule。
public partial class XamlDialog : System.Windows.Window
{
private System.Windows.Controls.ValidationRule xxxValidationRule;
public XamlDialog()
{
InitializeComponent();
InitializeResources();
}
public void InitializeResources()
{
this.xxxValidationRule = (ValidationRule)this.Resources["xxxValidationRule"];
this.xxxValidationRule.FooObject= new FooObject();
}
...
}
重点是,当 XXXValidationRule.Validate 被触发时,FooObject 属性 总是空的。
如果我使用 属性 FooObject 的值类型 int,效果相同。
如果我仍然使用值类型 int 并像下面那样在 XAML 中明确设置 属性,我会在验证规则中收到正确的值 (99)。
<Binding.ValidationRules>
<viewModel:XXXValidationRule FooObject="99"/>
</Binding.ValidationRules>
...
首先,ValidationRule 是否只支持值类型,或者是否有办法如上所述使用引用类型?其次,我们是否必须在 XAML 中显式设置此类属性,或者是否有办法在代码隐藏中设置它?
感谢您的帮助:-)
刚刚找到解决方案。感谢 dkozl 的评论和这个 Whosebug 的回答
如果我们定义验证规则如
<Binding.ValidationRules>
<viewModel:XXXValidationRule FooObject="99"/>
</Binding.ValidationRules>
...
意味着绑定 Binding.ValidationRules
将始终创建 XXXValidationRule
的新实例。要解决该问题,请按以下方式使用 StaticResource
。
<Binding.ValidationRules>
<StaticResource ResourceKey="xxxValidationRule"/>
</Binding.ValidationRules>
...
我正在使用以下 System.Windows.ValidationRule.
public class XXXValidationRule : ValidationRule
{
public object FooObject { get; set;}
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
Bar barObject = this.FooObject.BarObject;
}
}
我的XAML显示是这样的。
<ui:Windows.Resources>
<ResourceDictionary>
<viewModel:XXXValidationRule x:key="xxxValidationRule"/>
</ResourceDictionary>
</ui:Windows.Resources>
...
<TextBox.Text>
<Binding Path="..." UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<viewModel:XXXValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
到目前为止一切顺利。现在,在我的 XAML 对话框的代码隐藏中,我按如下方式初始化 ValidationRule。
public partial class XamlDialog : System.Windows.Window
{
private System.Windows.Controls.ValidationRule xxxValidationRule;
public XamlDialog()
{
InitializeComponent();
InitializeResources();
}
public void InitializeResources()
{
this.xxxValidationRule = (ValidationRule)this.Resources["xxxValidationRule"];
this.xxxValidationRule.FooObject= new FooObject();
}
...
}
重点是,当 XXXValidationRule.Validate 被触发时,FooObject 属性 总是空的。
如果我使用 属性 FooObject 的值类型 int,效果相同。
如果我仍然使用值类型 int 并像下面那样在 XAML 中明确设置 属性,我会在验证规则中收到正确的值 (99)。
<Binding.ValidationRules>
<viewModel:XXXValidationRule FooObject="99"/>
</Binding.ValidationRules>
...
首先,ValidationRule 是否只支持值类型,或者是否有办法如上所述使用引用类型?其次,我们是否必须在 XAML 中显式设置此类属性,或者是否有办法在代码隐藏中设置它?
感谢您的帮助:-)
刚刚找到解决方案。感谢 dkozl 的评论和这个 Whosebug 的回答
如果我们定义验证规则如
<Binding.ValidationRules>
<viewModel:XXXValidationRule FooObject="99"/>
</Binding.ValidationRules>
...
意味着绑定 Binding.ValidationRules
将始终创建 XXXValidationRule
的新实例。要解决该问题,请按以下方式使用 StaticResource
。
<Binding.ValidationRules>
<StaticResource ResourceKey="xxxValidationRule"/>
</Binding.ValidationRules>
...