2011-09-17 3 views
4

je vais avoir un formulaire avec deux zones de texte:WPF liant propriété ValidationRule

  1. TotalLoginsTextBox

  2. UploadsLoginsTextBox

je veux limiter UploadsLoginsTextBox si l'entrée maximale pour le texte sera la valeur de la TotalLoginsTextBox. J'utilise également un convertisseur de valeur si je tente de lié à la valeur maximale:

c'est le XAML:

<!-- Total Logins --> 
<Label Margin="5">Total:</Label> 
<TextBox Name="TotalLoginsTextBox" MinWidth="30" Text="{Binding Path=MaxLogins, Mode=TwoWay}" /> 
<!-- Uploads --> 
<Label Margin="5">Uploads:</Label> 
<TextBox Name="UploadsLoginsTextBox" MinWidth="30"> 
    <TextBox.Text> 
     <Binding Path="MaxUp" Mode="TwoWay" NotifyOnValidationError="True"> 
      <Binding.ValidationRules> 
       <Validators:MinMaxRangeValidatorRule Minimum="0" Maximum="{Binding Path=MaxLogins}" /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

le problème que je reçois l'erreur suivante:

A 'Binding' cannot be set on the 'Maximum' property of type 'MinMaxRangeValidatorRule'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

ce est la bonne façon de faire la liaison?

Répondre

-1

Je suppose que le "MinMaxRangeValidatorRule" est quelque chose de personnalisé.

Le message d'erreur est tout à fait explicite en fait, vous devez faire la variable « Maximum » une propriété de dépendance, comme ceci:

public int Maximum 
{ 
    get { return (int)GetValue(MaximumProperty); } 
    set { SetValue(MaximumProperty, value); } 
} 

// Using a DependencyProperty as the backing store for Maximum. This enables animation, styling, binding, etc... 
public static readonly DependencyProperty MaximumProperty = 
    DependencyProperty.Register("Maximum", typeof(int), typeof(MinMaxRangeValidatorRule), new UIPropertyMetadata(0)); 

Vous pouvez accéder à l'extrait de propriété de dépendance en tapant « propdp » dans VS2010.

+3

Vous ne pouvez pas simplement ajouter un dépôt propriété d'endurance. ValidationRule ne s'étend pas de DependencyObject – Matt

7

Vous voyez cette erreur, car MinMaxRangeValidatorRule.Maximum doit être un DependencyProperty si vous voulez lier à maxlogins, alors qu'il est probablement une simple propriété CLR.

Le véritable problème est que MinMaxRangeValidatorRule devrait pouvoir hériter de ValidationRule AND de DependencyObject (pour rendre les propriétés de dépendance disponibles). Ce n'est pas possible en C#.

Je résolu un problème similaire de cette façon:

  1. donner un nom à votre règle de validateur

    <Validators:MinMaxRangeValidatorRule Name="MinMaxValidator" Minimum="0" /> 
    
  2. dans le code derrière, définissez la valeur maximale à chaque fois que maxlogins change

    public int MaxLogins 
    { 
        get { return (int)GetValue(MaxLoginsProperty); } 
        set { SetValue(MaxLoginsProperty, value); } 
    } 
    public static DependencyProperty MaxLoginsProperty = DependencyProperty.Register("MaxLogins ", 
                            typeof(int), 
                            typeof(mycontrol), 
                            new PropertyMetadata(HandleMaxLoginsChanged)); 
    
    private static void HandleMinValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
        mycontrol source = (mycontrol) d; 
        source.MinMaxValidator.Maximum = (int) e.NewValue; 
    } 
    
+0

Grande solution, merci. J'étais tellement concentré sur le travail de liaison, que j'ai complètement oublié comment simplement surmonter le problème –

Questions connexes