114 messaggi dal 09 luglio 2009
Buongiorno a tutti.
per una mia piccola applicazione WPF ho una finestra che mi carica in SQL Server una serie di informazioni.

Nello specifico ho questo XAML (vi scrivo solo alcune righe per non copiare l'intero codice):
<dxlc:LayoutGroup>
                <dxlc:LayoutGroup x:Name="layoutGroup" Orientation="Vertical" VerticalAlignment="Top">
                    <StackPanel Orientation="Horizontal" Height="50" HorizontalAlignment="Right">
                    <dxlc:LayoutItem Label="Codice Articolo:" LabelPosition="Left" Margin="0,0,20,0">
                            <TextBox x:Name="IDArticolo"
                                     Text="{Binding Source={StaticResource ArticoliViewModel}, Path=IdArticolo}"
                                     Height="50"  Width="100" FontSize="30" FontWeight="Bold" FontStyle="Italic" Margin="0,0,0,0" ></TextBox>    
                    </dxlc:LayoutItem>
                        <dxlc:LayoutItem Label="Data Acquisizione:" LabelPosition="Left" Margin="0,0,0,0">
                            <TextBox x:Name="DataAcquisizione"  Text="{Binding Source={StaticResource ArticoliViewModel}, Path=DataAcquisizione}"  Width="200" Height="50" FontSize="30" FontWeight="Bold"  Margin="50,0,0,0" IsReadOnly="True"></TextBox>
                        </dxlc:LayoutItem>
                        </StackPanel>
                    <dxlc:LayoutItem IsRequired="True" Label="Nome Articolo:" LabelPosition="Top">
                        <dxe:TextEdit x:Name="NomeArticolo" MinWidth="200"
                             Text="{Binding Source={StaticResource ArticoliViewModel}, Path=NomeArticolo}" />
                    </dxlc:LayoutItem>
                </dxlc:LayoutGroup>
            </dxlc:LayoutGroup>


E questo ViewModel (anche di questo vi posto solo quello che serve)
    
   Public Property InsertCommand As InsertArticole
        Private _articolo As New Articoli

        Public Property Articolo As Articoli
            Get
                Return _articolo
            End Get
            Set(value As Articoli)
                _articolo = value
                OnPropertyChanged()
            End Set
        End Property
        Public Property IdArticolo As Integer
            Get
                If IsNothing(Articolo.idArticolo) Then
                    Return 0
                Else
                    Return Articolo.idArticolo
                End If
            End Get
            Set(value As Integer)
                Articolo.idArticolo = value
                OnPropertyChanged()
            End Set
        End Property
        Public Property NomeArticolo As String
            Get
                Return Articolo.NomeArticolo
            End Get
            Set(value As String)
                Articolo.NomeArticolo = value
                OnPropertyChanged()
            End Set
        End Property

  Public Sub Memorizza(ByVal WM As ArticoliViewModel)
            context.Articoli.Add(Articolo)
            context.SaveChanges()
            MsgBox("Ho inserito il nuovo articolo con ID " & Articolo.idArticolo)
        End Sub

 Public Sub OnPropertyChanged(<CallerMemberName> Optional propertyName As String = Nothing)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
        End Sub



Riesco senza particolari problemi ad inserire l'articolo sul DB. Il mio problema è che vorrei che sulla TextBox IDArticolo mi venga visualizzato l'ID della insert appena effettuata. Sarà una fesseria ma non riesco a venirne a capo. Sapete aiutarmi? Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
affinché la view possa sapere che l'id è cambiato, devi sollevare l'evento PropertyChanged per la proprietà IdArticolo.
Quindi, subito dopo il SaveChanges metti:
OnPropertyChanged("IdArticolo")


ciao,
Moreno

Enjoy learning and just keep making
114 messaggi dal 09 luglio 2009
Ciao Moreno,
in realtà ho già proceduto nella maniera da te consigliata:

Public Property IdArticolo As Integer
            Get
                Return Articolo.idArticolo
            End Get
            Set(value As Integer)
                Articolo.idArticolo = value
                OnPropertyChanged("IdArticolo")
            End Set
        End Property

  Public Sub Memorizza(ByVal WM As ArticoliViewModel)
            context.Articoli.Add(Articolo)
            context.SaveChanges()
            OnPropertyChanged(IdArticolo)
            MsgBox("Ho inserito il nuovo articolo con ID " & Articolo.idArticolo)

        End Sub


E lato XAML:
<TextBox x:Name="IDArticolo"
                                     Text="{Binding Source={StaticResource ArticoliViewModel}, Path=IdArticolo}"
                                     Height="50"  Width="100" FontSize="30"  FontWeight="Bold" FontStyle="Italic" Margin="0,0,0,0" BorderBrush="{x:Null}" IsReadOnly="True" ></TextBox>    


Nonostante tutto però l'id articolo nella view non si aggiorna!

Ho notato però che se implemento INotifyPropertyChanged direttamente sulla classe modello,cioé:

Partial Public Class Articoli
    Implements INotifyPropertyChanged

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    Public Sub OnPropertyChanged(<CallerMemberName> Optional propertyName As String = Nothing)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End Sub

    Public Sub New()
        DettaglioCaricoMagazzino = New HashSet(Of DettaglioCaricoMagazzino)()
    End Sub

    Private _idArticolo As Integer
    <Key>
    Public Property idArticolo As Integer
        Get
            Return _idArticolo
        End Get
        Set(value As Integer)
            _idArticolo = value
            OnPropertyChanged()
        End Set
    End Property

Ed impostando lo XAML cosi, riesco a ricevere il risultato corretto.

<TextBox x:Name="IDArticolo"
                                     Text="{Binding Source={StaticResource ArticoliViewModel}, Path=Articolo.IdArticolo}"
                                     Height="50"  Width="100" FontSize="30"  FontWeight="Bold" FontStyle="Italic" Margin="0,0,0,0" BorderBrush="{x:Null}" IsReadOnly="True" ></TextBox>    


Sai illuminarmi?
Grazie mille
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Marco,


Nonostante tutto però l'id articolo nella view non si aggiorna!

Ricontrolla di aver configurato correttamente il binding e di aver sollevato l'evento property changed. E' tutto quel che serve.

Ad esempio vedo che hai scritto:
OnPropertyChanged(IdArticolo)

Ma OnOPropertyChanged vuole il nome della proprietà, e non il suo valore. Quindi devi mettere le virgolette, così:
OnPropertyChanged("IdArticolo")


Eventualmente, se ancora non dovesse funzionare, imposta esplicitamente la modalità di binding su OneWay. Infatti, se fosse stata inavvertitamente impostata su OneTime, la view non si riceverebbe gli aggiornamenti.


Ho notato però che se implemento INotifyPropertyChanged direttamente sulla classe modello

Non lo fare; non dovresti contaminare i modelli con questioni che riguardano le view.

ciao,
Moreno

Enjoy learning and just keep making
114 messaggi dal 09 luglio 2009
Ciao Moreno
Ho risolto il problema.

Il tutto era dovuto ad un problema di configurazione della classe Modello. Non impostavo bene il PropertyChanged!
grazie
Modificato da marcopuccio il 22 febbraio 2017 16.45 -

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.