2010-01-21 9 views
10

Vorrei visualizzare avvisi ed errori durante la convalida di un oggetto aziendale e visualizzarli visivamente all'utente.Visualizzazione di avvisi in modo simile agli errori su un controllo wpf

Per esempio io ho una classe di oggetti di business implementando un'interfaccia in questo modo:

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

Questo è destinato all'interfaccia utente come segue:

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

Un errore potrebbe essere:

  • Prezzo < 0 => "Il prezzo non può essere inferiore a 0"

Questo funziona correttamente e disegna un bordo rosso attorno alla casella di testo quando inserisco il messaggio di errore sull'oggetto business utilizzando l'interfaccia IDataErrorInfo.

Quello che vorrei fare è specificare anche le avvertenze, per esempio:

  • Prezzo < 15 || Prezzo> 30 => "Prezzo fuori tolleranza"

Queste avvertenze inseriscono un bordo arancione attorno a una casella di testo e informano l'utente che potrebbe esserci un problema ma non impediscono che procedano.

Gli avvisi sono memorizzati in un dizionario di stringhe mappatura PropertyName => WarningMessage in modo simile a IDataErrorInfo.

Domanda: Qual è il modo migliore per farlo?

  • Ovviamente avrò bisogno di uno stile che contiene un bordo arancione per la casella di testo, ma come faccio a innescare esso?
  • Non voglio uno stile separato per ogni casella di testo, quindi come può lo stile accedere al bind sottostante per ottenere il nome della proprietà che dovrebbe cercare nel dizionario.
+0

Ho riscontrato un problema molto simile (http://stackoverflow.com/questions/3813365/mimicking-validation-behaviour-without-validation), quindi pubblicherò una taglia qui. – GWLlosa

risposta

2
+0

Il ErrorProvider che si trova in quel progetto sembra incentrato su modi alternativi di generare errori, piuttosto che modi per differenziare gli errori dagli avvisi. – GWLlosa

+0

Hai ragione. Questo sembra molto più grande di quello che ho visto. Tuttavia, è possibile ottenere ciò taggando i dati delle eccezioni con il valore richiesto. –

+0

@GWLlosa Ho aggiornato il mio post, per favore controlla. –

0

Un buon modo per farlo è uno stile personalizzato che aveva datatriggers su un proprietà di convalida (eventualmente VSV leavearge e gotostateaction

Exa mple da uno dei miei progetti:

<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

Si sta legando qui a UnitData.TestState. L'idea che sto cercando è quella di riuscire a riprodurre efficacemente il binding, senza conoscere il nome della proprietà (UnitData.TestState) fino al runtime, preferibilmente riutilizzando in qualche modo il binding del valore corrente della colonna corrente. – GWLlosa

+0

nulla ti impedisce di eseguire un binding + percorso dell'elemento. – Firoso

+0

Sembra molto simile a quello che sto cercando di ottenere; hai un esempio della sintassi per riferirti al tuo legame? – GWLlosa

0

CSLA.Net ha un controllo denominato PropertyStatus che viene utilizzato per questo scopo (Errore, Avviso o Informazioni), così come funzionalità aggiuntiva legata al resto del CSLA. Ma si potrebbe guardare il codice (open source) per come viene gestito lì.

Sembra che si possa anche utilizzare un convertitore sul colore del bordo associato all'oggetto (o al dizionario di avvertenza, ma con l'intero oggetto è possibile gestire gli errori tramite IDataErrorInfo) con un parametro del convertitore per specificare la proprietà su controlla. Sono sicuro che potresti semplificarlo ulteriormente con un po 'di fanciness usando la sintassi del binding di elementi o qualcosa del genere. Il convertitore restituirebbe il colore che si desidera visualizzare.

Problemi correlati