web-dev-qa-db-fra.com

Lier par programme List à ListBox

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?

22
Jason Miesionczek

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.

39
Matt Hamilton

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>
19
Cameron MacFarland

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;
15
aku

eventList.ItemsSource = ListOfNames;

2
NotDan