testa
 
 
 
Internet Observable Collection in WPF
cornice di chiusura
 
Articolo orginale
Una ObservableCollection è una collection dinamica di oggetti di un certo tipo. Oggetti possono essere aggiunti, rimossi o aggiornati con azioni automatiche di notifica. Quando un oggetto viene aggiunto o rimosso da una OC, la UI viene aggiornata automaticamente. Questo succede perché, quando viene "bindato" ad una ObservableCollecion, WPF aggiunge automaticamente un event handler di tipo CollectionChanged agli eventi della ObservableCollecion stessa.
La classe ObservableCollection esiste nel namespace System.Collections.ObjectModel
Dimostrazione di come funziona in un esempio:
Abbiamo una finestra con un pulsante, due TextBox ed una ListView. Ogni volta che si preme il pulsante il testo del TextBox viene aggiunto alla collezione e la ListView viene aggiornata automaticamente
UI
Code File

public partial class MainWindow : Window
{
  private ObservableCollection person;

  public MainWindow()
  {
    InitializeComponent();
    person = new ObservableCollection()
    {
      new Person() { Name="Prabhat",Address="India" },
      new Person() { Name="Smith",Address="US" }
    };
    lstNames.ItemsSource = person;
  }

  private void btnNames_Click(object sender, RoutedEventArgs e)
  {
    person.Add(new Person() { Name = txtName.Text, Address = txtAddress.Text });
    txtName.Text = string.Empty;
    txtAddress.Text = string.Empty;
  }
}

public class Person
{
  public string Name { get; set; }
  public string Address { get; set; }
}

In questo esempio la classe Person ha due proprietà: Name ed Address. Viene creato un oggetto ObservableCollecion di tipo Person e ListView viene bindato a questo oggetto.

lstNames.ItemsSource = person;

Facendo questo, possiamo dinamicamente inserire, aggiornare e cancellare oggetti dalla ListView:

person.Add(new Person() { Name = txtName.Text, Address = txtAddress.Text });

XAML File

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition/>
      <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
      <RowDefinition Height="*"></RowDefinition>
  </Grid.RowDefinitions>
  <StackPanel Grid.Row="0" Grid.Column="0" Margin="5,5,5,5">
    <TextBlock x:Name="lblName" Text="Name"></TextBlock>
    <TextBox x:Name="txtName"></TextBox>
    <TextBlock x:Name="lblAddress" Text="Address"></TextBlock>
    <TextBox x:Name="txtAddress"></TextBox>
    <Button Grid.Column="0" Width="100" Height="20" Margin="5,5,5,5" x:Name="btnNames" Click="btnNames_Click" Content="Add"></Button>
  </StackPanel>
  <ListView x:Name="lstNames" Margin="5,5,5,5" Grid.Column="1" Grid.Row="0">
    <ListView.View>
      <GridView x:Name="grdNames">
      <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
      <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}"/>
      </GridView>
    </ListView.View>
  </ListView>
</Grid>

L'ObservableCollecion è già bindata alla ListView. Quindi, tutto quello che dobbiamo fare nel file XAML è specificare il membro per ogni singola colonna. Possiamo farlo mediante l'attributo "DisplayMemberBinding" ed il markup "Binding" come di seguito:

 
 
 
 
I23 di Boccaletti Emanuele
 
I23 di Boccaletti Emanuele
41121 Modena (MO)
Tel. +39 347 1302420
emanuele@i23.eu
Skype: emanuele.boccaletti
 
 
Copyright © I23 di Boccaletti Emanuele - emanuele@i23.eu