2010-01-21 10 views
10

Me gustaría mostrar advertencias y errores al validar un objeto comercial y que se muestren visualmente al usuario.Mostrar advertencias de forma similar a los errores en un control wpf

Por ejemplo, tengo una clase de objeto de negocio de la implementación de una interfaz de este modo:

interface IOrderItem : IDataErrorInfo 
{ 
    int ProductId { get; set; } 
    string ProductName { get; set; } 
    decimal Price { get; set; } 
    IDictionary<string, string> Warnings { get; } 
} 

Esto está ligado a la interfaz de usuario de la siguiente manera:

<TextBox Text="{Binding Price, ValidatesOnDataErrors=True}/> 

un error sería:

  • Precio < 0 => "El precio no puede ser menor que 0"

Esto funciona bien y dibuja un borde rojo alrededor del cuadro de texto cuando coloco el mensaje de error en el objeto comercial utilizando la interfaz IDataErrorInfo.

Lo que me gustaría hacer es especificar también advertencias, por ejemplo:

  • < Precio 15 || Precio> 30 => "Precio fuera de tolerancia"

Estas advertencias colocarán un borde naranja alrededor de un cuadro de texto e informarán al usuario que puede haber un problema pero no pueden detener el proceso.

Las advertencias se almacenan en un mapeo de diccionario de cadenas PropertyName => WarningMessage de forma similar a IDataErrorInfo.

Pregunta: ¿Cuál es la mejor manera de hacerlo?

  • Obviamente necesitaré un estilo que contenga un borde naranja para el cuadro de texto, pero ¿cómo lo desencadenaré?
  • No quiero realmente un estilo separado para cada cuadro de texto, entonces, ¿cómo puede el estilo acceder al enlace subyacente para obtener el nombre de propiedad que debería buscar en el Diccionario?
+0

Me encontré con un problema muy similar (http://stackoverflow.com/questions/3813365/mimicking-validation-behaviour-without-validation), así que estoy publicando una recompensa aquí. – GWLlosa

Respuesta

2
+0

El ErrorProvider ubicado en ese proyecto parece centrarse en formas alternativas de generar errores, en lugar de formas de diferenciar los errores de las advertencias. – GWLlosa

+0

Tienes razón. Esto se ve muy grande de lo que parecía. Pero, puede lograr esto etiquetando los datos de excepción con el valor requerido. –

+0

@GWLlosa He actualizado mi publicación, por favor revisa. –

0

Una buena manera de hacer esto es un estilo personalizado que tenía datatriggers en una propiedad de validación (posiblemente de última generación VSM y gotostateaction.

Exa MPLE de uno de mis proyectos:

<i:Interaction.Triggers> 
    <ei:DataTrigger Binding="{Binding UnitData.TestState}" Value="Unknown"> 
     <ei:GoToStateAction StateName="UnknownState"/> 
    </ei:DataTrigger> 
    <ei:DataTrigger Binding="{Binding UnitData.TestState}" Value="Pass"> 
     <ei:GoToStateAction StateName="PassState"/> 
    </ei:DataTrigger> 
    <ei:DataTrigger Binding="{Binding UnitData.TestState, Mode=OneWay}" Value="Fail"> 
     <ei:GoToStateAction StateName="FailState"/> 
    </ei:DataTrigger> 
    <ei:DataTrigger Binding="{Binding UnitData.TestState, Mode=OneWay}" Value="Terminated"> 
     <ei:GoToStateAction StateName="FailState"/> 
    </ei:DataTrigger> 
    <ei:DataTrigger Binding="{Binding UnitData.TestState, Mode=OneWay}" Value="Warn"> 
    <ei:GoToStateAction StateName="WarnState"/> 
    </ei:DataTrigger> 
    <ei:DataTrigger Binding="{Binding UnitData.TestState}" Value="Indeterminate"> 
     <ei:GoToStateAction StateName="IndeterminateState"/> 
    </ei:DataTrigger> 
</i:Interaction.Triggers> 
+0

Usted está vinculando aquí a UnitData.TestState. La idea que busco es poder reproducir eficazmente su enlace, sin conocer el nombre de la propiedad (UnitData.TestState) hasta el tiempo de ejecución, de preferencia reutilizando el enlace de valor actual de la columna actual. – GWLlosa

+0

nada le impide hacer un elemento binding + path. – Firoso

+0

Eso suena muy parecido a lo que trato de decir; ¿Tiene un ejemplo de la sintaxis para referirse a su propia encuadernación? – GWLlosa

0

CSLA.Net tiene un control denominado PropertyStatus que se utiliza para este propósito (error, advertencia o información), así como funcionalidad adicional ligado al resto de CSLA. Pero puede mirar el código (código abierto) para saber cómo se maneja allí.

Parece que también podría usar un convertidor en el color del borde vinculado al objeto (o al diccionario de advertencia, pero con todo el objeto también podría manejar los errores a través de IDataErrorInfo) con un parámetro de convertidor para especificar la propiedad comprobar. Estoy seguro de que podría simplificar esto aún más con cierta sofisticación usando la sintaxis de enlace de elementos o algo así. El convertidor devolverá el color que desea mostrar.

Cuestiones relacionadas