Tengo una situación en la que estoy usando el enlace de datos wpf y la validación usando la ExceptionValidationRule.¿Cómo me deshago del rectángulo rojo cuando la validación de mi enlace wpf ha fallado y el panel contenedor ya no está visible?
Otra parte de la solución implica colapsar algunos paneles y mostrar otros.
Si se establece una excepción de validación, es decir, la interfaz de usuario muestra un borde rojo alrededor del elemento UI con el problema de validación y el panel contenedor está contraído, el borde rojo aún se muestra. Esto claramente no está destinado a ser? ¿Hay una solución para esto? Alguien sabe si esto es por diseño?
Ejemplo de código mínimo proporcionado (no es mi código real, pero reproduce el problema). Crea una nueva aplicación Wpf (llamé a la mía WpfDataBindingProblem).
el XAML para window1 es el siguiente:
<Window x:Class="WpfDataBindingProblem.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel Margin="5">
<StackPanel Name="panel1" Visibility="Visible" Margin="5">
<TextBox Name="DataBoundTextBox">
<Binding Path="TextValue">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox>
</StackPanel>
<StackPanel Name="panel2" Visibility="Collapsed" Margin="5">
<TextBlock>
The quick brown fox jumps over the lazy dog.
</TextBlock>
</StackPanel>
<Button Click="Button_Click" Margin="5">
Toggle panels
</Button>
</StackPanel>
</Window>
El código para window1 es el siguiente:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfDataBindingProblem {
public partial class Window1 : Window {
public Window1() {
InitializeComponent();
this.DataContext = new MyClass("default");
}
private void Button_Click(object sender, RoutedEventArgs e) {
panel1.Visibility = panel1.Visibility == Visibility.Collapsed ?
Visibility.Visible : Visibility.Collapsed;
panel2.Visibility = panel2.Visibility == Visibility.Collapsed ?
Visibility.Visible : Visibility.Collapsed;
}
}
public class MyClass : INotifyPropertyChanged {
private string mTextValue;
public MyClass(string defaultText) {
TextValue = defaultText;
}
public string TextValue {
get {
return mTextValue;
}
set {
mTextValue = value;
if (string.IsNullOrEmpty(mTextValue)) {
throw new ApplicationException("Text value cannot be empty");
}
OnPropertyChanged(new PropertyChangedEventArgs("TextValue"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) {
if (this.PropertyChanged != null) {
this.PropertyChanged(this, e);
}
}
}
}
Para reproducir el problema, ejecute la aplicación. Elimine el predeterminado texto del cuadro de texto y la pestaña desactivado - se muestra un rectángulo rojo que indica un problema de validación. Clic en el botón. El panel que contiene el control con rectángulo rojo está oculto y se muestra otro panel, pero el rectángulo rojo permanece. ¡Aargh!
Toda ayuda muy apreciada.
PD ¡Disculpas por el título de la pregunta larga!
Donnelle, Esto es fantástico! Exactamente lo que necesito Muchas gracias, Sam –
De nada. ¡Encantado de ayudar! – Donnelle
Eso es increíblemente simple. ¡¡¡Gracias!!! – Pwninstein