J'aimerais savoir comment programmer une validation de manière programmée sur un DataGridColumn. Il serait à peu près la même chose que la Donde appelle la méthode de mise à jour d'une controlingexpression, mais je ne pouvais pas réussir à obtenir la liaison de la colonne. P>
Merci. P>
PS: Réglage de la propriété ValidatesontargetUpdated sur la validationrule n'est pas ce que je recherche :) p>
3 Réponses :
Dans le .NET Framework 4, un espace de noms appelé system.componentmodel.dataannotations est disponible pour le CLR commun (WPF) et le briquet Silverlight CLR. Vous pouvez utiliser l'espace de nom de basenotation à diverses fins. L'un d'entre eux est que la validation des données à l'aide des attributs, et une autre est la description visuelle des champs, des propriétés et des méthodes, ou de personnaliser le type de données d'une propriété spécifique. Ces trois catégories sont classées dans la structure .NET comme attributs de validation, attributs d'affichage et attributs de modélisation de données. Cette section utilise des attributs de validation pour définir des règles de validation pour les objets p>
http://www.codeproject.com/kb/dotnet/validationdotnetframework.aspx < / a> p>
user424096,
Je n'ai aucun accès à mon environnement Visual Studio, mais en suivant le pseudo code peut vous guider pour votre manière désirée ... p>
Créez une propriété booléenne attachée appelée notifysourcepeumdates et joindre est à DataGridCell ... Je l'ai attachée au niveau de DataGrid afin qu'elle s'applique également à toutes les cellules de la grille de données ... Vous pouvez également la fixer au niveau de la colonne. .. p>
ValidationError validationError = new ValidationError(myValidationRule, uiElement.GetBindingExpression(UIElement.MyValueDependecyProperty)); validationError.ErrorContent = "Value is empty!"; Validation.MarkInvalid(uiElement.GetBindingExpression(UIElement.MyValueDependencyProperty), validationError);
Ce comportement ci-joint gérera l'événement ci-joint appelé la liaison.SourceUpdated au niveau de la cellule. Donc, chaque fois que n'importe quelle partie de tout mode normal ou d'édition d'un élément de l'interface utilisateur a mis à jour sa source, il tire et bulle au niveau de la cellule. P>
(uiElement.MyValue == null) //// Invalid!!
Dans ce gestionnaire d'événements, les événements arguments sont de type DataTransfereventargs qui vous donne la cibleObject. Ce sera votre contrôle qui doit valider. p>
private static void OnSourceUpdatedHandler(object obj, DataTransferEventArgs e) //// Please double check this signature { var uiElement = e.TargetObject as UIElement; if (uiElement != null) { ///... your code to validated uiElement. } }
Vous devez savoir quelle valeur représentée par le contrôle est valide ou invalide. P>
public static readonly DependencyProperty NotifySourceUpdatesProperty = DependencyProperty.RegisterAttached( "NotifySourceUpdates", typeof(bool), typeof(MyAttachedBehavior), new FrameworkPropertyMetadata(false, OnNotifySourceUpdates) ); public static void SetNotifySourceUpdates(UIElement element, bool value) { element.SetValue(NotifySourceUpdatesProperty, value); } public static Boolean GetNotifySourceUpdates(UIElement element) { return (bool)element.GetValue(NotifySourceUpdatesProperty); } private static void OnNotifySourceUpdates(DependencyObject d, DependencyPropertyEventArgs e) { if ((bool)e.NewValue) { ((DataGridCell)d).AddHandler(Binding.SourceUpdated, OnSourceUpdatedHandler); } }
Si vous souhaitez que la liaison de la commande soit invalidée, utilisez simplement l'appel Markinvalid en utilisant ces étapes ... P>
<DataGrid ItemsSource="{Binding}"> <DataGrid.CellStyle> <Style TargetType="DataGridCell" > <Setter Property="ns:MyAttachedBehavior.NotifySourceUpdates" Value="True"/> </Style> </DataGrid.CellStyle> </DataGrid>
Vous pourriez envisager d'implémenter System.componentModel.idatarseRorinfo a > Pour permettre la validation de ces entrées. p>