Je veux lier la propriété attachée ou la propriété de dépendance dans xaml pour la ValidationRule dans xaml et ensuite en fonction de la valeur de la propriété jointe ou de la propriété de dépendance que je veux prendre en compte dans la règle Validation . Je ne trouve pas de solution Comment puis-je transmettre une valeur pouvant être liée à la règle de validation?Attachment ou dependecy Propriété pour ValidationRule WPF
Répondre
Je vous fournis un code d'exemple pour vous aider. J'ai défini une ValidationRule pour valider une entrée utilisateur texbox. Le type de validation est effectué en fonction de la valeur d'un paramètre enum. Le type de validation disponible est: l'entrée utilisateur ne peut pas être vide, l'entrée utilisateur doit être numérique, l'entrée utilisateur doit être une adresse IP. Un deuxième paramètre permet de spécifier le message d'avertissement affiché. Comme vous le savez, une variable à des fins de liaison doit être DependendyProperty, donc vous trouvez ici une déclaration avec des paramètres.
public class ValidationParams : DependencyObject
{
// Dependency Properties
public static readonly DependencyProperty MessageProperty = DependencyProperty.Register("Message",
typeof(string),
typeof(ValidationParams),
new FrameworkPropertyMetadata(string.Empty));
public static readonly DependencyProperty ValidationTypeProperty = DependencyProperty.Register("ValidationType",
typeof(FieldValidationRule.EnmValidationType),
typeof(ValidationParams),
new FrameworkPropertyMetadata(FieldValidationRule.EnmValidationType.FieldNotEmpty));
// Properties
[Category("Message")]
public string Message
{
get { return (string)GetValue(MessageProperty); }
set { SetValue(MessageProperty, value); }
}
[Category("ValidationType")]
public FieldValidationRule.EnmValidationType ValidationType
{
get { return (FieldValidationRule.EnmValidationType)GetValue(ValidationTypeProperty); }
set { SetValue(ValidationTypeProperty, value); }
}
Puis voici la classe ValidationRule:
public class FieldValidationRule : ValidationRule
{
public enum EnmValidationType
{
FieldNotEmpty,
FieldNumeric,
FieldIPAddress
}
// Local variables and objects
private ValidationParams mParams = new ValidationParams();
public ValidationParams Params
{
get { return mParams; }
set { mParams = value; }
}
// Override
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
ValidationResult objResult = null;
string sValue = value as string;
objResult = new ValidationResult(true, null);
switch (Params.ValidationType)
{
case EnmValidationType.FieldNotEmpty:
if(string.IsNullOrEmpty(sValue) == true)
objResult = new ValidationResult(false, Params.Message);
break;
case EnmValidationType.FieldNumeric:
int iValue = 0;
if(int.TryParse(sValue, out iValue) == false)
objResult = new ValidationResult(false, Params.Message);
break;
case EnmValidationType.FieldIPAddress:
IPAddress objValue = IPMatrix.CreateHostAddr();
if(IPAddress.TryParse(sValue, out objValue) == false)
objResult = new ValidationResult(false, Params.Message);
break;
}
return objResult;
}
}
Et enfin voici le code XAML:
<TextBox Style="{DynamicResource FieldValue}" Grid.Column="1" IsReadOnly="False">
<TextBox.Text>
<Binding Source="{StaticResource XmlItemChannel}" XPath="@Name" Mode="TwoWay" UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<data:FieldValidationRule>
<data:FieldValidationRule.Params>
<data:ValidationParams Message="{DynamicResource ERR002}" ValidationType="FieldNotEmpty" />
</data:FieldValidationRule.Params>
</data:FieldValidationRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Vous pouvez voir que le paramètre message est binded à une ressource, mais vous peut classiquement le lier aussi.
Bon travail, mais si vous essayez de vous lier à lui, vous obtenez une erreur de liaison «Impossible de trouver la gouvernance FrameworkElement ou FrameworkContentElement pour l'élément cible». Thomas Levesque a une réponse pour cela, voir http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/ –
Pouvez-vous fournir plus d'informations sur ce que vous essayez précisément d'obtenir (entrées, sortie attendue, etc.)? – Moonshield