in

dotNet Umbria

Il primo User Group in Umbria sul mondo .Net
Latest post 06-20-2008 12:52 PM by Paolo Possanzini. 7 replies.
Page 1 of 1 (8 items)
Sort Posts: Previous Next
  • 05-19-2008 3:36 PM

    • dardino
    • Top 10 Contributor
    • Joined on 05-19-2008
    • Perugia

    Associazione dati tra controlli WPF e LINQ

    Ho creato un file dbml che rappresenta il mio database.
    In questo dbml ho una tabella (Tipi) con questa struttura:

    codice (string)
    descrizione (string)

    ho creato una WPF Form con una ListView associata alla tabella Tipis del
    LINQDataContext che mi viene generato dal dbml.

    Mando in esecuzione ed ho infatti nella tabella, l'elenco dei miei tipi.

    il codice:

    <Window
        xmlns="
    http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="
    http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="
    http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="
    http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        x:Class="Tipi"
        Title="Tipi" Height="416" Width="469" 
        ResizeMode="NoResize"
        WindowStartupLocation="CenterOwner"
        Focusable="True"
       
    WindowStyle="SingleBorderWindow">
     <Window.Resources>
      <ObjectDataProvider x:Key="dbMsSqlDataContextDS" d:IsDataSource="True"
                                ObjectType="{x:Type MyLinqToDb:dbMsSqlDataContext}"/>
        </Window.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="24" />
                <RowDefinition Height="1*" />
                <RowDefinition Height="50" />
            </Grid.RowDefinitions>
         <ListView IsSynchronizedWithCurrentItem="True" Margin="8,8,8,8" Grid.Row="1"
                   MouseDoubleClick="ListaElementi_MouseDoubleClick"
                   x:Name="ListaElementi"
                   ItemsSource="{Binding Path=Tipis, Mode=OneWay, Source={StaticResource dbMsSqlDataContextDS}}"
                   SelectedValuePath="TipoCodice">
          <ListView.View>
           <GridView>
               <GridViewColumn Header="Codice" DisplayMemberBinding="{Binding Path=TipoCodice}"/>
               <GridViewColumn Header="Descrizione" DisplayMemberBinding="{Binding Path=TipoDescrizione}"/>
           </GridView>
          </ListView.View>
         </ListView>
        </Grid>
    </Window>

    Ora vorrei poter modificare le descrizioni (non i codici in quanto potrebbero violare qualche relazione) e salvare le modifiche nel database.
    Come posso fare?

    Grazie

  • 05-19-2008 5:22 PM In reply to

    Re: Associazione dati tra controlli WPF e LINQ

    Ciao, è abbastanza semplice.

    Quando definisci la colonna della GridView devi evitare di inserire il DisplayMemberBinding, ed inserire un DataTemplate all'interno della proprietà CellTemplate del GridViewColumn. Puoi farlo colonna per colonna.
    Quindi è semplicissimo scegliere per quali colonne inserire la possibilità di editing.

    Ecco un veloce esempio.

    <ListView IsSynchronizedWithCurrentItem="True" Margin="8,8,8,8" Grid.Row="1" x:Name="ListaElementi"  ItemsSource="{Binding Source={StaticResource dbMsSqlDataContextDS}}" SelectedValuePath="TipoCodice">
      
    <ListView.View>
         
    <GridView>

            
    <GridViewColumn Header="Codice" DisplayMemberBinding="{Binding Path=Codice}"/>

            
    <GridViewColumn Header="Descrizione" >
               
    <GridViewColumn.CellTemplate>
                  
    <DataTemplate>
                     
    <TextBox Text="{Binding Path=Descrizione}" />
                  
    </DataTemplate>
               
    </GridViewColumn.CellTemplate>
           
    </GridViewColumn>

        
    </GridView>
      
    </ListView.View>
    </ListView>

    Dentro un DataTemplate puoi inserire tutti i controlli che vuoi. In questo caso ho inserito un TextBox. Il Binding lo fai su quello.
    Una volta editati i dati è sufficiente richiamare il metodo SubmitChanges del DataContext per inserire i dati modificati nel DB.
    Spero di essere stato chiaro.

    Ciao

  • 05-22-2008 11:40 AM In reply to

    • dardino
    • Top 10 Contributor
    • Joined on 05-19-2008
    • Perugia

    Re: Associazione dati tra controlli WPF e LINQ

    Come faccio a chiamare il metodo SubmitChanges del DataContext da WPF?

    Ho creato un bottone e vorrei che al momento del clik mi richamasse questo metodo.

    se creo un handler per il bottone nel codice c#, dal codice c# non risco a raggiungere il mio DataContext che è stato definito direttamente in WPF se me ne creo uno nuovo e faccio submitchanges va bene lo stesso?

     Grazie

  • 05-22-2008 12:13 PM In reply to

    Re: Associazione dati tra controlli WPF e LINQ

    No, non va bene lo stesso.
    Il problema è che i dati modificati sono gestiti dal DataContext a cui i dati appartengono, per cui se crei un nuovo DataContext, il nuovo DataContext non conosce le modifiche che sono state fatte.
    Se utilizzi ObjectDataProvider con la modalità ObjectType, il DataProvider provvederà a creare una nuova instanza del tuo oggetto per l'accesso ai dati.

    L'instanza creata dal provider è accessibile da C# attraverso il provider stesso.
    Puoi utilizzare il seguente codice per ottenere la tua instanza:

    ((ObjectDataProvider)this.Resources["dbMsSqlDataContextDS"].ObjectInstance

    Questo perchè il tuo provider è visibile a livello di form come risorsa e una volta che il provider ha creato l'instanza dell'oggetto che gli server per accedere ai dati,
    poi la rende pubblica attraverso ObjectInstance.

    Personalmente preferisco un approccio leggermente differente,
    ovvero al caricamento della form fornisco io l'instanza per l'accesso ai dati al provider con un codice simile al precedente.

    ObjectDataProvider prov = ((ObjectDataProvider)this.Resources["dbMsSqlDataContextDS"];
    prov.ObjectDataType=null;
    prov.ObjectInstance = myDataContextInstance;

    In questo modo ho più controllo e posso riutilizzare il DataContext in scenari più vasti.
    Ci sono anche altri modi per passare le sorgenti dati agli oggetti WPF e a volte è anche una questione di gusti personali Wink

    Ciao

  • 05-22-2008 1:27 PM In reply to

    • dardino
    • Top 10 Contributor
    • Joined on 05-19-2008
    • Perugia

    Re: Associazione dati tra controlli WPF e LINQ

    Infatti non funziona niente Sad ..

    Posso postare il mio progetto? se si Come?

    Intanto te lo mando per e-mail, non cestinarlo...

    Grazie

  • 05-22-2008 1:49 PM In reply to

    Re: Associazione dati tra controlli WPF e LINQ

    Puoi postare il tuo progetto selezionando il Tab Options che trovi in alto nell'editor mentri scrivi il post.
    Mandami anche via email che lo guardo.

     

    Ciao

  • 05-23-2008 1:19 PM In reply to

    • dardino
    • Top 10 Contributor
    • Joined on 05-19-2008
    • Perugia

    Re: Associazione dati tra controlli WPF e LINQ

    Sono riuscito nel mio intento!!

    ora ho un'altro problema, se aggiungo una riga al mio DataContext con questa routine:

    Public Sub AddNew()
        Dim myDataProvider As ObjectDataProvider = CType(Me.Resources("MsSqlDbDataContextDS"), ObjectDataProvider)
        Dim myDataContext As MsSqlDbDataContext = CType(myDataProvider.ObjectInstance, MsSqlDbDataContext)
        Dim MioRecord As New TabTipi
        MioRecord.TipoCodice = "COD"
        MioRecord.TipoDescrizione = "Nuovo tipo descrizione"
        myDataContext.TabTipis.InsertOnSubmit(MioRecord)
        myDataContext.SubmitChanges()
    End Sub

    Mi inserisce tutto correttamente ma non mi aggiorna la ListView infatti se chiudo e riapro la finestra, funziona correttamente.
    Quale metodo devo chiamare per "refreshare" la listview e caricare i dati aggiornati?

    Grazie

  • 06-20-2008 12:52 PM In reply to

    Re: Associazione dati tra controlli WPF e LINQ

     Le collection di Linq to SQL non implementano le interfacce per segnalare agli altri controlli che hanno subito delle modifiche.
    Devi intercettare la BindingExpression e chiamarne il refresh.

    Puoi seguire il mio post "Invalidate Binding" per effettuare il refresh del binding.

    ciao

Page 1 of 1 (8 items)
dotNet Umbria 2007-2008
Powered by Community Server (Commercial Edition), by Telligent Systems