2009-01-03 10 views
1

Le système de validation WPF effectue la validation initiale d'un objet (je veux dire: tous les champs sont validés lorsqu'un élément de la base de données est modifié et les résultats sont affichés sur l'interface utilisateur). Mais cela ne fonctionne pas comme ça, quand j'ajoute dynamiquement un contrôle. Dans ce cas, la validation inital se produit, mais les résultats ne sont pas affichés sur l'interface utilisateur. Seulement après que certaines propriétés sur un objet de base de données changent, tout commence à fonctionner correctement. Voici un échantillon brut.Validation initiale du contrôle ajouté dynamiquement

Supposons que nous ayons MyObject classe

public class MyObject : INotifyPropertyChanged, IDataErrorInfo 
{ 
    public string Name { /*get, set implementation */}   

    // IDataErrorInfo 
    public string this[string columnName] 
    { 
     get 
     { 
      if (String.IsNullOrEmpty(Name)) return "Name can't be empty!"; 
      return String.Empty; 
     } 
    } 
    /* etc. */ 
} 

Et un certain contrôle de l'utilisateur, par exemple MyUserControl, qui permet d'éditer des objets myObject. Il peut regarder un peu comme ceci:

<UserControl x:Class="Test.MyUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Name: "/> 
      <TextBox Text="{Binding Name, ValidatesOnDataErrors=True}" Width="200"/> 
     </StackPanel> 
</UserControl> 

Maintenant, quand ce contrôle est ajouté à la fenêtre principale en XAML (ou code derrière dans le constructeur ou fenêtre événement chargé) que lorsque MyCustomControl.DataContext est réglé sur une nouvelle instance de la classe MyObject, le champ Name est immédiatement validé et la notification d'erreur est affichée à l'aide du modèle d'erreur de validation. Mais lorsque MyCustomControl est ajouté dynamiquement (après avoir cliqué sur le bouton, par exemple), la validation initiale se produit mais les résultats ne s'affichent pas (aucune bordure rouge, etc.)

Supposons que la fenêtre d'application se compose d'un dockpanel (dockPanel) et d'un bouton:

public Window1() 
     { 
      InitializeComponent(); 

      button.Click +=new RoutedEventHandler(OnButtonClick); 

      /* 
      // in this case validation works correctly, 
      // when window is shown Name textbox already got a red border etc. 
      var muc = new MyUserControl(); 
      dockPanel.Children.Add(muc); 
      muc.DataContext = new MyObject(); 
      */ 
     } 


     private void OnButtonClick(object sender, RoutedEventArgs e) 
     { 
      // in this case validatation works, but no results are shown on the ui 
      // only after Name property is changed (then removed again) red border appears 
      var muc = new MyUserControl(); 
      dockPanel.Children.Add(muc); 
      muc.DataContext = new MyObject(); 
     } 

Pourquoi?

Répondre

1

Ok, j'ai trouvé une sorte de réponse. C'est un problème avec la couche Adorner. Nos gourous WPF l'ont déjà rencontré et ont fourni une solution. Voir Karl Shifflett's post.

Questions connexes