2009-08-21 7 views
1

Il existe déjà un very similar question. En fait, le résultat de la réponse dans ce post est exactement ce que je veux, mais je n'ai pas de code derrière pour placer ce code. Toute notre logique est encapsulée dans un ViewModel. Puisque le ViewModel n'est pas supposé avoir de références directes à des éléments visuels spécifiques, ce code ne peut pas exister non plus. Existe-t-il un moyen d'effectuer la même chose dans XAML, ou ai-je finalement trouvé une raison pour être obligé de créer des fichiers codebehind?Force la validation sur les contrôles liés de XAML?

Répondre

1

Vous pouvez essayer de faire quelque chose avec properties..it attaché est un peu compliqué, mais il fait la même chose que l'autre réponse, donc je pense que cela devrait fonctionner:

public class DependencyPropertyCollection : List<DependencyProperty> 
{ } 

public static class ValidationUtil 
{ 
    public static readonly DependencyProperty ForceValidationProperty = 
     DependencyProperty.RegisterAttached("ForceValidation", typeof(DependencyPropertyCollection), typeof(ValidationUtil), new PropertyMetadata(OnForceValidationChanged)); 
    private static void OnForceValidationChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     FrameworkElement element = (FrameworkElement)sender; 
     element.Loaded += OnElementLoaded; 
    } 

    private static void OnElementLoaded(object sender, RoutedEventArgs e) 
    { 
     FrameworkElement element = (FrameworkElement)sender; 
     element.Loaded -= OnElementLoaded; 
     foreach (DependencyProperty property in GetForceValidation(element)) 
      element.GetBindingExpression(property).UpdateSource(); 
    } 

    public static DependencyPropertyCollection GetForceValidation(DependencyObject obj) 
    { 
     return (DependencyPropertyCollection)obj.GetValue(ForceValidationProperty); 
    } 
    public static void SetForceValidation(DependencyObject obj, DependencyPropertyCollection value) 
    { 
     obj.SetValue(ForceValidationProperty, value); 
    } 
} 

Et vous l'utiliser comme ceci:

<TextBlock Text="{Binding Text}"> 
    <local:ValidationUtil.ForceValidation> 
     <local:DependencyPropertyCollection> 
      <x:StaticExtension Member="TextBlock.TextProperty"/> 
     </local:DependencyPropertyCollection> 
    </local:ValidationUtil.ForceValidation> 
</TextBlock> 

A l'intérieur de la collection, vous spécifiez chaque DependencyProperty qui a une liaison que vous voulez valider.

Questions connexes