2015-03-11 2 views
0

J'utilise System.Windows.ValidationRule.System.Windows.Controls.ValidationRule ne prend en charge que les types de valeur pour les propriétés

public class XXXValidationRule : ValidationRule 
{ 
    public object FooObject { get; set;} 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     Bar barObject = this.FooObject.BarObject; 
    } 
} 

Mon XAML s'affiche comme ceci.

<ui:Windows.Resources> 
    <ResourceDictionary> 
     <viewModel:XXXValidationRule x:key="xxxValidationRule"/> 
    </ResourceDictionary> 
</ui:Windows.Resources> 
... 
<TextBox.Text> 
    <Binding Path="..." UpdateSourceTrigger="PropertyChanged"> 
     <Binding.ValidationRules>     
      <viewModel:XXXValidationRule/> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox.Text> 

Jusqu'ici tout va bien. Maintenant, dans le code derrière mon dialogue XAML, j'initialise la ValidationRule comme suit.

public partial class XamlDialog : System.Windows.Window 
{ 
    private System.Windows.Controls.ValidationRule xxxValidationRule; 

    public XamlDialog() 
    { 
     InitializeComponent(); 
     InitializeResources(); 
    } 

    public void InitializeResources() 
    { 
     this.xxxValidationRule = (ValidationRule)this.Resources["xxxValidationRule"]; 
     this.xxxValidationRule.FooObject= new FooObject(); 
    } 
    ... 
} 

Le point est, quand XXXValidationRule.Validate est déclenché la propriété FooObject est toujours nulle.

Si je travaille avec le type de valeur int pour le Property FooObject, même effet. Si je travaille toujours avec le type de valeur int et que vous définissez explicitement la propriété dans XAML comme suit, je reçois la valeur correcte (99) dans la règle de validation. Tout d'abord, est-ce que ValidationRule ne prend en charge que les types de valeur ou existe-t-il un moyen de travailler avec les types de référence décrits plus haut? Deuxièmement, devons-nous définir ces propriétés explicitement en XAML ou est-il possible de le définir dans Code Behind?

Merci pour l'aide :-)

+1

votre liaison 'Binding.ValidationRules' créera une nouvelle instance de' XXXValidationRule' et n'utilisera pas l'instance de la ressource où vous définissez 'FooObject' – dkozl

Répondre

0

Juste trouvé la solution. Merci au commentaire de dkozl et ce Stackoverflow répondre https://stackoverflow.com/a/3173461/3835909

Si l'on définit la règle de validation tels que

<Binding.ValidationRules> 
    <viewModel:XXXValidationRule FooObject="99"/> 
</Binding.ValidationRules> 
... 

signifie que la liaison Binding.ValidationRules créera toujours nouvelle instance de XXXValidationRule. Pour résoudre cela, utilisez StaticResource comme suit.

<Binding.ValidationRules> 
    <StaticResource ResourceKey="xxxValidationRule"/> 
</Binding.ValidationRules> 
...