Newsgroup: it.comp.dotnet
Titolo: WPF listview itemssource e selecteditem da XAML

Salve a tutti
Ho una window che contiene una listview. La window ha il datacontext
impostato su di una classe che contiene una proprietà listaRicevute
popolata con alcuni item.
Apro la window ma la listview non contiene elementi, mentre se
nell'evento load della window imposto l'itemssource della listview a
listaRicevute si popola.
La proprietà listaRIcevute è di tipo ObservableCollection<Ricevuta>.
La mia classe contiene anche una proprietà di tipo Ricevuta chiamata
RicevutaSelezionata che segue la selezione degli item della listview e
che dovrebbe rilevare l'attuale ricevuta. Come penso sia chiaro,non
funziona, mentre invece se imposto l'evento selectionchanged è tutto
regolare.
Posto il codice:
        <ListView x:Name="lv"
                  Margin="0"
                  Grid.Row="2"
                  IsSynchronizedWithCurrentItem="True"
                  ItemsSource="{Binding listaRicevute}"
                  SelectedItem="{Binding RicevutaSelezionata,
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ListView.View>
				<GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding
Mittente}" Header="Mittente"/>
					<GridViewColumn DisplayMemberBinding="{Binding Indirizzo}"
Header="Indirizzo"/>
					<GridViewColumn DisplayMemberBinding="{Binding CapMittente}"
Header="Cap"/>
					<GridViewColumn DisplayMemberBinding="{Binding LocalitàMittente}"
Header="Località"/>
					<GridViewColumn DisplayMemberBinding="{Binding
ProvinciaMittente}" Header="Provincia"/>
					<GridViewColumn DisplayMemberBinding="{Binding Destinatario}"
Header="Destinatario"/>
					<GridViewColumn DisplayMemberBinding="{Binding
IndirizzoDestinatario}" Header="Indirizzo"/>
					<GridViewColumn DisplayMemberBinding="{Binding CapDestinatario}"
Header="Cap"/>
					<GridViewColumn DisplayMemberBinding="{Binding
LocalitàDestinatario}" Header="Località"/>
					<GridViewColumn DisplayMemberBinding="{Binding
ProvinciaDestinatario}" Header="Provincia"/>
					<GridViewColumn DisplayMemberBinding="{Binding PagatoNonPagato}"
Header="Pagato"/>
					<GridViewColumn DisplayMemberBinding="{Binding Importo}"
Header="Importo"/>
					<GridViewColumn DisplayMemberBinding="{Binding Pezzi}"
Header="Pezzi"/>
					<GridViewColumn DisplayMemberBinding="{Binding Peso}"
Header="Peso"/>
					<GridViewColumn DisplayMemberBinding="{Binding Contenuto}"
Header="Contenuto"/>
				</GridView>
			</ListView.View>
		</ListView>
Saluti
Fabio

 regolare.
puoi postare anche lo sceheltro della classe che usi come DataContext? 
quando sei in esecuzione con il debugger attaccato non ha informazioni 
nella output window?
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

Ciao,
coi tuoi dati ho impostato queste due classi:
namespace WpfApplication1
{
     public class Class1
     {
         public string Mittente { get; set; }
         public string Indirizzo { get; set; }
         public string CapMittente { get; set; }
         public string LocalitàMittente { get; set; }
         public string ProvinciaMittente { get; set; }
         public string Destinatario { get; set; }
         public string IndirizzoDestinatario { get; set; }
         public string CapDestinatario { get; set; }
         public string LocalitàDestinatario { get; set; }
         public string ProvinciaDestinatario { get; set; }
         public string PagatoNonPagato { get; set; }
         public string Importo { get; set; }
         public string Pezzi { get; set; }
         public string Peso { get; set; }
         public string Contenuto { get; set; }
         public Class1(int i)
         {
             Mittente = "mittente" + i;
             Indirizzo = "indirizzo" + i;
             CapMittente = "cap" + i;
             LocalitàMittente = "località" + i;
             ProvinciaMittente = "provincia" + i;
             Destinatario = "destinatario" + i;
             IndirizzoDestinatario = "indirizzo" + i;
             CapDestinatario = "cap" + i;
             LocalitàDestinatario = "località" + i;
             ProvinciaDestinatario = "provincia" + i;
             PagatoNonPagato = "pagato" + i;
             Importo = "importo" + i;
             Pezzi = "pezzi" + i;
             Peso = "peso" + i;
             Contenuto = "contenuto" + i;
         }
         public override string ToString()
         {
             return Mittente + Environment.NewLine + Indirizzo + 
Environment.NewLine + CapMittente + Environment.NewLine;
         }
     }
     public class ListaRicevute
     {
         public List<Class1> listaRicevute { get; set; }
         public Class1 RicevutaSelezionata { get; set; }
         public ListaRicevute()
         {
             listaRicevute = new List<Class1>();
             listaRicevute.Add(new Class1(0));
             listaRicevute.Add(new Class1(1));
             listaRicevute.Add(new Class1(2));
             listaRicevute.Add(new Class1(3));
             listaRicevute.Add(new Class1(4));
             listaRicevute.Add(new Class1(5));
         }
     }
}
la mia finestra è:
<Window x:Class="WpfApplication1.MainWindow"
         xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation
"
         xmlns:x="
http://schemas.microsoft.com/winfx/2006/xaml
"
         Title="MainWindow" Height="344" Width="525">
     <Grid>
         <Grid.RowDefinitions>
             <RowDefinition Height="250"/>
             <RowDefinition Height="*"/>
         </Grid.RowDefinitions>
         <ListView x:Name="lv"
                   Margin="0"
                   Grid.Row="0"

         <TextBlock Grid.Row="1" Name="textBlock1" Text="{Binding 
RicevutaSelezionata}" VerticalAlignment="Top" />
     </Grid>
</Window>
e il suo codebehind:
namespace WpfApplication1
{
     /// <summary>
     /// Interaction logic for MainWindow.xaml
     /// </summary>
     public partial class MainWindow : Window
     {
         public MainWindow()
         {
             DataContext = new ListaRicevute();
             InitializeComponent();
         }
     }
}
a me funziona, vedi se c'è qualcosa che può aiutarti.
Probabilmente imposti male il DataContext, da qualche parte il binding 
deve sapere a chi si deve riferire.
Un'alternativa al caricarlo prima di inizializzare i componenti, cioè 
questo:
             DataContext = new ListaRicevute();
             InitializeComponent();
potrebbe essere, lato xaml:
<Window x:Class="WpfApplication1.MainWindow"
         xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation
"
         xmlns:x="
http://schemas.microsoft.com/winfx/2006/xaml
"
         xmlns:data="clr-namespace:WpfApplication1"
         Title="MainWindow" Height="344" Width="525">
     <Window.Resources>
         <data:ListaRicevute x:Key="ilMioDataContext" />
     </Window.Resources>
     <Grid DataContext="{StaticResource ilMioDataContext}">
etc. etc.
ciao


I dettagli vengono caricati  regolarmente.
Per quanto riguarda l'assegnazione del datacontext, lo assegno al
monento della chiamata:
frmRicevute frm=new frmRicevute();
cStampaRicevute ric=new cStampaRicevute();
frm.DataContext=ric;
frm.Show;

         public ObservableCollection<cRicevuta> listaRicevute;
ma sono dei field e non delle proprietà? il motore di data binding 
funziona solo con le proprietà.


 blog @
http://milestone.topics.it


 quali sono fileds?
public ObservableCollection<cRicevuta> listaRicevute;
è un field, una proprietà sarebbe:
public ObservableCollection<cRicevuta> listaRicevute
{
   get;
   private set;
}
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it



Si è vero ho fatto un test ed ora va'.
Grazie per l'aiuto.
Ciao
Fabio