visual restaurant net modernos moderno modernista formularios formulario food fast designing application c# .net wpf validation data-binding

c# - restaurant - ¿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?



formularios modernos en c# (2)

Si no recuerdo mal, este es un problema conocido. Hemos redefinido el cuadro de texto para incluir lo siguiente:

<Setter Property="Validation.ErrorTemplate"> <Setter.Value> <ControlTemplate> <ControlTemplate.Resources> <BooleanToVisibilityConverter x:Key="converter" /> </ControlTemplate.Resources> <DockPanel LastChildFill="True"> <Border BorderThickness="1" BorderBrush="Red" Visibility="{Binding ElementName=placeholder, Mode=OneWay, Path=AdornedElement.IsVisible, Converter={StaticResource converter}}"> <AdornedElementPlaceholder x:Name="placeholder" /> </Border> </DockPanel> </ControlTemplate> </Setter.Value> </Setter>

Tengo una situación en la que estoy usando el enlace de datos wpf y la validación usando la ExceptionValidationRule.

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 de la interfaz de usuario con el problema de validación, y el panel que lo contiene se contrae, 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 texto predeterminado del cuadro de texto y la pestaña desactivada: 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 largo título de la pregunta!


Tengo una respuesta al problema, que es cambiar el botón de mi clic, que cambia la visibilidad de los paneles. Esto cambiaría a algo como esto:

private void Button_Click(object sender, RoutedEventArgs e) { if (panel1.Visibility == Visibility.Collapsed) { panel1.Visibility = Visibility.Visible; DataBoundTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); panel2.Visibility = Visibility.Collapsed; } else { panel1.Visibility = Visibility.Collapsed; DataBoundTextBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget(); panel2.Visibility = Visibility.Visible; } }

UpdateSource () y UpdateTarget () tienen el efecto de volver a aplicar y eliminar el rectángulo rojo, pero esto parece un hack feo. Seguramente el framework wpf debería ocultar el rectángulo rojo para mí cuando el panel contenedor esté colapsado. Cualquier arreglo más limpio que no me obligue a jugar con la expresión vinculante obtiene mi voto.

Gracias,

Sam