2010-11-24 8 views
1

J'ai un combobox et un bouton sur mon formulaire. Le combobox a des catégories en eux. Je veux autoriser/interdire en attente s'il s'agit d'une 'catégorie système' basée sur un booléen.WPF/C# IDataErrorInfo ne pas tirer

Voici mon XAML:

<Window.Resources> 
    <Style TargetType="{x:Type ComboBox}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" 
       Value="{Binding RelativeSource={RelativeSource Self}, 
         Path=(Validation.Errors)[0].ErrorContent}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

Ceci est le panneau de la pile avec les deux contrôles en eux:

   <StackPanel Grid.Column="1" Grid.Row="1"> 
        <Label Content="Delete Category" Height="28"/> 
        <ComboBox x:Name="comboBox_DeleteCategory" 
           Grid.Row="1" 
           Height="29"         
           ItemsSource="{Binding Path=CategorySelected.Items, ValidatesOnDataErrors=true, NotifyOnValidationError=true}" 
           SelectedItem="{Binding Path=CategorySelected.SelectedItem ,ValidatesOnDataErrors=True, NotifyOnValidationError=true}" 
           DisplayMemberPath="Name"/> 
        <Button Content="Delete" Height="25" Margin="0,5,0,0" HorizontalAlignment="Right" Width="103.307" Command="{Binding DeleteCommand}"/> 
       </StackPanel> 

Je suis en train d'obtenir le combobox pour montrer une info-bulle s'il est déterminé que c'est une catégorie de système. La commande DeleteCommand fonctionne correctement, donc je n'ai pas de problème avec le bouton étant désactivé lorsque je reçois un hit sur la catégorie du système.

Ceci est mon code pour afficher l'info-bulle:

#region IDataErrorInfo Members 

public string Error { get; set; } 

public string this[string columnName] 
{ 
    get 
    { 
    Error = ""; 
    switch (columnName) 
    { 
     case "comboBox_DeleteCategory": 
     if (CategorySelected.SelectedItem != null && CategorySelected.SelectedItem.IsInternal) 
     { 
      Error = CategorySelected.SelectedItem.Name + " is an system category and cannot be deleted."; 
      break; 
     } 
     break; 

    } 

    return Error; 
    } 
} 

#endregion 

Toutes les suggestions?

Merci,

Eroc

Répondre

3

L'indexeur (chaîne publique ce [columnName string]) est appelée avec le nom de la propriété qui a été modifié par la dernière mise à jour de liaison. C'est-à-dire que le filtrage de "comboBox_DeleteCategory" (le nom du contrôle) n'aidera pas ici. Vous devez filtrer pour la propriété qui a été mise à jour par la liaison du contrôle et déterminer si elle est dans l'état attendu. Vous pouvez placer un point d'arrêt dans l'indexeur et regarder la valeur de columnName. Qui plus est, la propriété Error n'est pas utilisée du tout par WPF. Ainsi, il n'est pas nécessaire de le définir. Un exemple simple:

public class Contact : IDataErrorInfo, INotifyPropertyChanged 
{ 
    private string firstName; 
    public string FirstName 
    { 
     // ... set/get with prop changed support 
    } 

    #region IDataErrorInfo Members 

    public string Error 
    { 
     // NOT USED BY WPF 
     get { throw new NotImplementedException(); } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
      // null or string.Empty won't raise a validation error. 
      string result = null; 

      if(columnName == "FirstName") 
      { 
       if (String.IsNullOrEmpty(FirstName)) 
        result = "A first name please..."; 
       else if (FirstName.Length < 5) 
        result = "More than 5 chars please..."; 
      } 

      return result; 
    } 
} 

#endregion 

}