14 messaggi dal 07 dicembre 2010
Ciao A tutti...ho una domanda sul binding che magari sarà anche banale..


Date le 2 classiche tabelle... didattiche ordini e prodotti con solita relazione “fraterna”...con il campo "ID categoria"


ordini===>codice
ID categoria
ecc....



tipo===>;ID categoria”
descrizione (auto,moto, barche,)


vorrei creare una pagina di inserimento dati in stile details x inserimento ordini bindata ovviamente agli ordini la cui scelta del tipo prodotto stia in una combo.

Non riesco a capire come legare il currentitem dell’ordine corrente (che potrebbe essere paginato con avanti ed indietro) in modo che il combo tipoprodotto/descrizione si aggiorni al valore corretto.

Se qualcuno riuscisse a darmi una indicazione sintattica del binding in questione gliene ne sarei davvero molto grato.

Grazie.
2.190 messaggi dal 04 marzo 2004
Contributi | Blog
bikelink ha scritto:
Ciao A tutti...ho una domanda sul binding che magari sarà anche banale..


Date le 2 classiche tabelle... didattiche ordini e prodotti con solita relazione “fraterna”...con il campo "ID categoria"


ordini===>codice
ID categoria
ecc....



tipo===>;ID categoria”
descrizione (auto,moto, barche,)


vorrei creare una pagina di inserimento dati in stile details x inserimento ordini bindata ovviamente agli ordini la cui scelta del tipo prodotto stia in una combo.

Non riesco a capire come legare il currentitem dell’ordine corrente (che potrebbe essere paginato con avanti ed indietro) in modo che il combo tipoprodotto/descrizione si aggiorni al valore corretto.

Se qualcuno riuscisse a darmi una indicazione sintattica del binding in questione gliene ne sarei davvero molto grato.

Grazie.

Ciao,
se non ho capito male, potresti bindare la ComboBox "tipoprodotto" ad una sorgente dati che contenga tutti i record (potresti farlo ad esempio con una StaticResource). Successivamente bindare la sua proprietà SelectedItem con la proprietà che contraddistingue il "tipoprodotto" dell'entità che stai modificando, ed inserire un IValueConverter per andare a creare il vincolo di uguaglianza tra gli elementi, e selezionare automaticamente l'occorrenza corrispondete.
 <DataTemplate>                  
                  <ComboBox ItemsSource="{Binding Categories, Source={StaticResource CategoriesManager}}"
                            SelectedItem="{Binding Categories, Converter={StaticResource SelectedItemCategoriesConverter}, Mode=TwoWay}"
                            DisplayMemberPath="Name"></ComboBox>
                </DataTemplate>


 public class SelectedItemCategoriesConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      Categories _value = (Categories)value;
      
      if (_value != null)
      {
        _value = (from c in CategoriesManager.Categories
                  where c.CategoryID == _value.CategoryID
                  select c).First();
      }

      return _value;
    }
//....

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer
14 messaggi dal 07 dicembre 2010
Perfetto!
una volta digerite le peculiarità del binding..è "un sacco bello"
Silverlight mi sta acchiappando un bel po'!
14 messaggi dal 07 dicembre 2010
Perfetto!
una volta digerite le peculiarità del binding..è "un sacco bello"
Silverlight mi sta acchiappando un bel po'!
grazie per questo suggerimento ;)
4 messaggi dal 12 marzo 2007
Ciao a tutti,
la mia domanda a questo punto è molto semplice... spero che qualcuno mi dica almeno che non si può fare, così mi metto l'anima in pace, dopo una giornata passata fra tutorial e motori di ricerca!!!

Vorrei fare la stessa cosa, in Silverlight 4, utilizzando un ComboBox all'interno di un DataForm (preso dall'ULTIMA versione del Silverlight toolkit)...
Riesco a fare praticamente tutto, ma quando il DataForm si sposta nella sua collezione di record (con i pulsantini di navigazione) il ComboBox sovrascrive i valori del nuovo record relativamente al campo che ha in binding con quelli del record corrente... corrompendo irrimediabilmente i dati!
Cosa posso fare?

Ecco il pezzo di XAML (si trova in un DataTemplate all'interno delle risorse di pagina)
                <toolkit:DataField PropertyPath="Responsabile">
                    <ComboBox HorizontalAlignment="Stretch" ItemsSource="{Binding Source={StaticResource ResponsabiliViewSource}}"
                              SelectedItem="{Binding Responsabile, Mode=TwoWay, Converter={StaticResource adapCodiceSoggetto}, ConverterParameter={StaticResource ResponsabiliViewSource}, NotifyOnValidationError=False}">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock VerticalAlignment="Center" Text="{Binding Cognome}" Margin="2"/>
                                    <TextBlock VerticalAlignment="Center" Text="{Binding Nome}" Margin="2"/>
                                    <TextBlock VerticalAlignment="Center" Margin="0" Text="(" />
                                    <TextBlock VerticalAlignment="Center" Text="{Binding CodiceFiscale}" Margin="0"/>
                                    <TextBlock VerticalAlignment="Center" Margin="0" Text=")" />
                                </StackPanel>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                </toolkit:DataField>


Più su, sempre nelle risorse:
        <CollectionViewSource x:Name="ResponsabiliViewSource" />
        <adapters:AdapterCodiceSoggetto x:Name="adapCodiceSoggetto" />


AdapterCodiceSoggetto è un IValueConverter che mi sono inventato che fa più o meno questo lavoro:
    Public Class AdapterCodiceSoggetto
        Inherits ViewModel.BindingAdapter(Of ServiceReference.Soggetto, Integer)

        Public Overrides Function ConvertValueBack(ByVal theObject As ServiceReference.Soggetto) As Integer
            If theObject Is Nothing Then _
                Return 0
            Return theObject.IDSoggetto
        End Function

        Public Overrides Function ConvertValue(ByVal theValue As Integer, ByVal lookupList As IEnumerable(Of ServiceReference.Soggetto)) As ServiceReference.Soggetto
            Dim Result = (From r In lookupList Where r.IDSoggetto = theValue Take 1).FirstOrDefault()
            Return Result
        End Function

    End Class


Aiutatemi, se potete!
Grazie di cuore!

Federico
4 messaggi dal 12 marzo 2007
Di nuovo ciao a tutti,
dopo una lunga, lunga, lunga giornata a combattere con il data-binding, uno decide che - per una volta - è meglio mandare al diavolo l'eleganza e proseguire con il proprio progetto, che ha da fare ancora molta, molta, molta strada. Quindi...

Con poche righe di codice la cosa si risolve "alla vecchia maniera", cioè effettuando il data-binding del ComboBox "a manazza" attraverso gli eventi DropDownClosed (del ComboBox) e ContentLoaded (del DataForm).
La chiave per eseguire tutto questo è il metodo FindNameInContent dell'oggetto DataForm, che permette di ottenere un controllo presente nel DataTemplate interessato dato il suo nome. Trovato questo, il resto è vecchia scuola. Posto per completezza:

VB:
    Private Sub dfmSettori_ContentLoaded(ByVal sender As Object, ByVal e As System.Windows.Controls.DataFormContentLoadEventArgs) Handles dfmSettori.ContentLoaded
        ' Naturalmente diventa necessario dare un nome al ComboBox all'interno del DataTemplate.
        Dim cb As ComboBox = dfmSettori.FindNameInContent("ComboBoxResponsabili")
        Dim s As ViewModel.Settore = dfmSettori.CurrentItem
        cb.SelectedItem = (From r In responsabiliColl Where r.IDSoggetto = s.Responsabile Take 1).FirstOrDefault()
    End Sub

    Private Sub ComboBoxReponsabile_DropDownClosed(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim s As ViewModel.Settore = dfmSettori.CurrentItem
        If s Is Nothing Then _
            Return

        Dim cmb As ComboBox = sender
        s.Responsabile = DirectCast(cmb.SelectedItem, ServiceReference.Soggetto).IDSoggetto
    End Sub


XAML:
                <toolkit:DataField PropertyPath="Responsabile">
                    <ComboBox x:Name="ComboBoxResponsabili" HorizontalAlignment="Stretch" ItemsSource="{Binding Source={StaticResource ResponsabiliViewSource}}" DropDownClosed="ComboBoxReponsabile_DropDownClosed">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                ...
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                </toolkit:DataField>


Peccato, però... il data-binding fornisce un qualcosa in più a livello di chiarezza e linearità della soluzione, speravo si potesse fare!

Buona notte a tutti!

Federico

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.