308 messaggi dal 08 gennaio 2011
Ciao,
Ho un oggetto con 3 proprietà in binding con 3 TextBox di cui una di tipo Integer nullable . Quando inserisco dei valori nelle TextBox grazie al binding si aggiornano i valori delle proprietà; stessa cosa se da codice modifico i valori delle proprietà dell'oggetto le TextBox si aggiornano. Siccome questo oggetto prevede che una delle proprietà possa avere valore nullo, vorrei capire come fare affinché se nella TextBox in binding con questa proprietà non digito niente o cancello quello che c'è la proprietà corrispondente assuma valore nullo.

Più precisamente succede questo : Se da codice (VB) imposto la proprietà nullable a Nothing, la TextBox corrispondente non visualizza nulla e uscendo dalla TextBox non viene visualizzato il bordo rosso, se invece digito un valore, poi esco dalla TextBox (LostFocus) poi rientro nella TextBox e cancello tutto ed esco di nuovo appare il bordo rosso e il valore della proprietà corrispondente dell'oggetto in binding è uguale a l'ultimo digitato anche se nella TextBox non c'è scritto alcunché.

Quindi come posso fare per passare un valore nullo ad una proprietà Nullable di un oggetto mediante una TextBox ?
308 messaggi dal 08 gennaio 2011
Ho provato anche con una ValidationRule ma niente...

Mi pare di capire che la comodità offerta dal Binding WPF si perde se si deve "passare valori nulli" a proprietà Nullable.

Dovrei gestire da codice gli eventi della TextBox e se vuota o piena sola di spazi mettere a Nothing la proprietà dell'oggetto sorgente.

Ho capito male ?
308 messaggi dal 08 gennaio 2011
Mi scuso per il titolo della discussione che solo ora mi sono accorto essere un pò contorto :)

Spero comunque che il senso sia stato capito. Il titolo non si può modificare normalmente.

Sarebbe meglio se fosse : Passare un valore nullo tramite una TextBox in binding con una proprietà nullable di un oggetto indicato come sorgente.

Grazie, mi scusino.
Modificato da Mario Formosa il 13 febbraio 2020 13:02 -
308 messaggi dal 08 gennaio 2011
Si risolve utilizzando nello XAML TargetNullValue come di seguito mostrato. Soluzione ottenuta sul forum MSDN.

<TextBox Text="{Binding Quantità,TargetNullValue=''}" />


Due giorni di crisi esistenziale per questo fatto.

L'avevo comunque visto l'utilizzo di TargetNullValue https://docs.microsoft.com/it-it/dotnet/api/system.windows.data.bindingbase.targetnullvalue?view=netframework-4.8
ma quello che c'è scritto nella documentazione ufficiale mi ha sviato completamente; c'è scritto che se la proprietà in binding è nulla nella TextBox corrispondente viene visualizzato ciò che contiene TargetNullValue.

Comunque resto deluso dal fatto che, come avviene il passaggio di valori 'normali' tra la TextBox e la proprietà, non avvenga automaticamente anche il passaggio di un valore nullo quando la TextBox è vuota e la proprietà in binding è nullable.

Grazie a tutti.
308 messaggi dal 08 gennaio 2011
La soluzione utilizzando TargetNullValue comunque non risolve un altro problema : Se nella TextBox si digitano caratteri non numerici la TextBox si borda di rosso e il valore della proprietà dell'oggetto in binding risulta sempre l'ultimo inserito valido.

La soluzione perfetta a questo problema quindi mi pare sia quella offerta dall'uso di un Converter.

Nell'esempio seguente è riportato l'uso di un converter applicato ad una proprietà di tipo Decimal Nullable rappresentante una valuta.

Nella TextBox corrispondente si possono digitare solo valori numerici decimali, anche formattati, quindi con punti virgola e simbolo di valuta. Nel caso si digiti altro o si cancelli il contenuto della TextBox, verrà restituito un valore nullo, la TextBox non visualizzerà niente e la proprietà dell'oggetto in binding risulterà Nulla.

L'uso del converter lato XAML

<Window.Resources>
        <local:CurrencyValueConverter x:Key="CurValConv"/>
</Window.Resources> 

<TextBox x:Name="CostoTB" Text="{Binding Path=Costo, Converter={StaticResource CurValConv}}" />




Il converter (VB)

Public Class CurrencyValueConverter
    Implements IValueConverter

    Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
        Dim res As String = Nothing
        'Forza la formattazione di Valuta 
        'i Parametri lato XAML si possono omettere 
        'o se specificati non verranno considerati
        If IsNumeric(value) Then
            res = FormatCurrency(CDec(value))
        End If
        Return res
    End Function

    Public Function ConvertBack(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Dim nd As Decimal? = Nothing
        If IsNumeric(value) Then
            nd = CDec(value)
        End If
        Return nd
    End Function

End Class


Ciao.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.