Mvvm delucidazione

mercoledì 29 giugno 2011 - 10.02

brux88 Profilo | Newbie

ciaoooo sono di nuovo qua =) , sto iniziando a studiare un po di model view view model, vi spiego il mio dubbio, ho un form wpf con una grid dove all'interno c sono delle textbox(una semplice anagarfica clienti), all'inetrno del progetto ho creato una classe clientiviewmodel dove sto inserendo tutta la logic business, per quanto riguarda il salvataggio mi funziona e il caricamento del primo cliente pure, pero quando cerco di fare una ricerca tramite una textbox dove inserisco l'id del cliente se faccio il debug vedo che mi carica il cliente giusto ma non capisco perche non mi aggiorna l'interfaccia utente vi posto il codice xaml della grid:

<Grid Grid.Row="2" HorizontalAlignment="Left" Margin="54,15,0,0" Name="clientiDataGrid" VerticalAlignment="Top" Height="155" Width="408" DataContext="{Binding rb3}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2" />
<ColumnDefinition Width="20" />
<ColumnDefinition Width="31" />
<ColumnDefinition Width="47*" />
<ColumnDefinition Width="116*" />
<ColumnDefinition Width="192*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Content="rscli:" HorizontalAlignment="Left" Margin="1,3,0,3" VerticalAlignment="Center" Grid.ColumnSpan="2" Grid.Column="1" />
<TextBox Grid.Column="3" Height="23" HorizontalAlignment="Left" Margin="3,3,0,3" Name="rscliTextBox" Text="{Binding Path=rscli, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="120" Grid.ColumnSpan="2" DataContext="{Binding}" />
<Label Content="rscli 2:" Grid.Row="1" HorizontalAlignment="Left" Margin="1,3,0,3" VerticalAlignment="Center" Grid.ColumnSpan="2" Grid.Column="1" />
<TextBox Grid.Column="3" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="3,3,0,3" Name="rscli2TextBox" Text="{Binding Path=rscli2, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="120" Grid.ColumnSpan="2" DataContext="{Binding}" TextChanged="rscli2TextBox_TextChanged" />
<Label Content="telecli:" Grid.Row="2" HorizontalAlignment="Left" Margin="1,3,0,3" VerticalAlignment="Center" Grid.ColumnSpan="2" Grid.Column="1" />
<TextBox Grid.Column="3" Grid.Row="2" Height="23" HorizontalAlignment="Left" Margin="3,3,0,3" Name="telecliTextBox" Text="{Binding Path=telecli, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="120" Grid.ColumnSpan="2" DataContext="{Binding}" />
<Label Content="indcli:" Grid.Row="3" HorizontalAlignment="Left" Margin="1,3,0,3" VerticalAlignment="Center" Grid.ColumnSpan="2" Grid.Column="1" />
<TextBox Grid.Column="3" Grid.Row="3" Height="23" HorizontalAlignment="Left" Margin="3,3,0,3" Name="indcliTextBox" Text="{Binding Path=indcli, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="120" Grid.ColumnSpan="2" DataContext="{Binding}" />
<Label Content="comcli:" Grid.Row="4" HorizontalAlignment="Left" Margin="1,3,0,3" VerticalAlignment="Center" Grid.ColumnSpan="2" Grid.Column="1" />
<TextBox Grid.Column="3" Grid.Row="4" Height="23" HorizontalAlignment="Left" Margin="3,3,0,3" Name="comcliTextBox" Text="{Binding Path=comcli, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="120" Grid.ColumnSpan="2" DataContext="{Binding}" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="91,6,0,3" Name="idclitxt" Text="{Binding Path=idcli, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="35" IsEnabled="False" DataContext="{Binding}" Grid.Column="5" />
</Grid>
<Label Content="rscli:" Grid.Row="1" HorizontalAlignment="Left" Margin="342,26,0,49" VerticalAlignment="Center" />
<Button Content="Ricerca 2" Grid.Row="1" HorizontalAlignment="Right" Margin="0,33,239,12" Name="btnRicerca2" Width="58" />
<TextBox Grid.Row="1" Height="27" HorizontalAlignment="Left" Margin="71,34,0,0" Name="txtric2" VerticalAlignment="Top" Width="121" />
<Label Content="Ric.xNome" Grid.Row="1" Height="28" HorizontalAlignment="Left" Margin="12,34,0,0" Name="label2" VerticalAlignment="Top" />
</Grid>


mentre il metodo ricerca che e inserito nella classe clientviewmodel è il seguente:

public string ricerca { get; set; }
public void ricerca2()
{
//ricerca per id
try
{
int ric =Convert.ToInt32(this.ricerca);
clienti loadedLog = db.clienti.Where(ent => ent.idcli == ric).First();
idtest = loadedLog.idcli;
this.rb3 = loadedLog;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}


freeteo Profilo | Guru

Ciao brux88,
mi sa che ti ho risposto anche in qualche altro thread... tipo questo: http://www.dotnethell.it/forum/messages.aspx?ThreadID=39473

Cmq la tua griglia non si aggiorna perchè nessuno le dice di farlo, ossia il suo "DataContext" non scatena l'evento PropertyChanged, ovvero non implementa INotifyPropertyChanged e di conseguenza non scatena l'evento sul "set" della proprietà che gli dai come DataContext (oppure ItemsSource a seconda) di un controllo grafico della UI.

Se guardi l'esempio che ti ho allegato in un thread precedente vedi proprio che nel set della proprietà scatena l'evento chiamando "RaiseChanged("...nome..."))...prova a guardare in dettaglio, perchè è questo che ti manca per farlo funzionare come vorresti...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

brux88 Profilo | Newbie

si hai ragione pero mi sembrava che ormai l'entity sapeva in automatico uando stavo modifciando o inserendo CIOè NEL CODICE CHE HO POSTATO SE VEDO IL DEBUG IN RB3 CI STA IL CLIENTE QUELLO CHE HO APPENA RICERCATO PERO COME FACCIO a farlo vedere nelle textbox visto che quest ultime gia sono associate alle varie proprieta tramite binding?

freeteo Profilo | Guru

Ciao,
bisognerebbe fare un po' di esempi sul tuo codice, impostando in maniera pulita...ma se vuoi provare in velocità, prova ad impostare this.rb3 = null e poi this.rb3 = loadedLog e vedi se ti refresha i controlli.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

brux88 Profilo | Newbie

il mio problema sta prorpio qua cie se vedo il debug passo passo ,mi accorgo che quando faccio la ricerca in loadlog c'è il cliente appena ricercato e quando faccio this.rb3 = loadlog i this.rb3 ce il cliente appena ricercato ma a video non me lo cambia =(

freeteo Profilo | Guru

Ciao,
mi sa che ti mancano alcune basi, ti ho provato a dare dei dettagli aggiuntivi qui:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=39444

vedi se ti possono essere utili, cmq rimane il fatto di non avere aperti 100 thread sulla stessa cosa, decidiamone uno e continiuamo su quello

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5