J'ai une zone de texte liée à mon objet de données. Si la validation échoue, je voudrais montrer un popup qui contient le message d'erreur. En XAML cela fonctionne bien. J'utilise le XAML suivant:Comment lier à Popup.IsOpen à Validation.HasError dans le code
<TextBox Height="23" Margin="54,12,104,0" Name="textBox1"
VerticalAlignment="Top" Text="{Binding Value, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Popup Name="myPopup" PlacementTarget="{Binding ElementName=textBox1}"
IsOpen="{Binding ElementName=textBox1, Path=(Validation.HasError), Mode=OneWay}"
>
<TextBlock Name="myPopupText" Background="LightBlue" Foreground="Blue">
The value is invalid
</TextBlock>
</Popup>
Mon problème est que je dois créer le menu contextuel et obligatoire dans le code et je ne peux pas le faire fonctionner. J'ai essayé plusieurs options différentes. J'ai également utilisé le convertisseur de dummy juste pour voir si la liaison fonctionne du tout. Il semble que la reliure fonctionne quand je la crée (elle obtient la valeur initiale) mais après cela rien ne se passe. Je peux voir que le Validation.HasError se met à jour correctement (la bordure de TextBox devient rouge), mais c'est tout. Mon convertisseur fictif n'est pas appelé. Voici le code que j'utilise:
Popup popup = new Popup();
popup.Name = "somepopup";
// Source is the textbox which is bound to the data object
popup.PlacementTarget = source;
popup.Placement = PlacementMode.Bottom;
TextBlock txtblock = new TextBlock();
txtblock.Background = Brushes.LightBlue;
txtblock.Foreground = Brushes.Blue;
txtblock.Text = "this is the error message";
popup.Child = txtblock;
Binding is_open_binding = new Binding("(Validation.HasError)");
is_open_binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
is_open_binding.Source = source;
is_open_binding.Mode = BindingMode.OneWay;
is_open_binding.NotifyOnValidationError = true;
is_open_binding.ValidatesOnExceptions = true;
is_open_binding.Converter = new TempValueConverter();
popup.SetBinding(Popup.IsOpenProperty, is_open_binding);