Disons, par exemple, que j'ai la fenêtre extrêmement simple suivante:
<Window x:Class="CalendarGenerator.Window1"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
Title="Window1"
Height="300"
Width="447">
<Grid>
<ListBox Margin="12,40,0,12"
Name="eventList"
HorizontalAlignment="Left"
Width="134" />
</Grid>
</Window>
Et une simple liste définie comme:
List<String> ListOfNames = new List<String>();
Et supposons que la liste comporte plusieurs noms. Comment pourrais-je lier la liste à la ListBox en utilisant autant de code que possible?
Vous devez d'abord donner un nom à votre ListBox afin qu'il soit accessible à partir de votre code derrière ( modifier Je note que vous l'avez déjà fait, donc je changerai mon exemple de nom de ListBox pour refléter le vôtre):
<ListBox x:Name="eventList" ... />
Ensuite, c'est aussi simple que de définir la propriété ListBox ItemsSource dans votre liste:
eventList.ItemsSource = ListOfNames;
Puisque vous avez défini votre objet "ListOfNames" en tant que List<String>
, la ListBox ne reflétera pas automatiquement les modifications apportées à la liste. Pour que la liaison de données de WPF réagisse aux modifications de la liste, définissez-la comme ObservableCollection<String>
au lieu.
Si la liste de données est créée en code, vous devrez la lier en code, comme ceci:
eventList.ItemsSource = ListOfNames;
La liaison à une liste de chaînes est maintenant un exemple très simple. Prenons un plus complexe.
Supposons que vous ayez une classe individuelle:
public class Person {
public string FirstName { get; set; }
public string Surname { get; set; }
}
Pour afficher une liste de personnes, vous pouvez lier une liste à ListBox, mais vous vous retrouverez avec une zone de liste qui affiche "Personne" pour chaque entrée, car vous n'avez pas dit à WPF comment afficher un objet personne.
Pour indiquer à WPF comment afficher visuellement les objets de données, nous définissons un DataTemplate comme suit:
<Window.Resources>
<DataTemplate DataType="{x:Type l:Person}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding Surname}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox Name="listBox" />
</Grid>
public Window1() {
InitializeComponent();
List<Person> people = new List<Person>();
people.Add(new Person() { FirstName = "Cameron", Surname = "MacFarland" });
people.Add(new Person() { FirstName = "Bea", Surname = "Stollnitz" });
people.Add(new Person() { FirstName = "Jason", Surname = "Miesionczek" });
listBox.ItemsSource = people;
}
Cela affichera joliment "Prénom Nom" dans la liste.
Si vous vouliez changer l'apparence pour dire "Nom, Prénom" tout ce que vous devez faire est de changer le XAML en:
<StackPanel Orientation="Horizontal">
<TextBlock FontWeight="Bold" Text="{Binding Surname}"/>
<TextBlock Text=", "/>
<TextBlock Text="{Binding FirstName}"/>
</StackPanel>
Utilisez la classe Binding si vous souhaitez personnaliser la liaison:
List<String> listOfNames = new List<String>() {"a", "b"};
Binding myBinding = new Binding();
//set binding parameters if necessary
myBinding.Source = listOfNames;
eventList.SetBinding(ItemsControl.ItemsSourceProperty, myBinding);
ou
attribuer directement des données à la propriété ItemsSource:
eventList.ItemsSource = listOfNames;
eventList.ItemsSource = ListOfNames;