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: |
|