web-dev-qa-db-fra.com

WPF: comment lier un objet à ComboBox

Essayer d'apprendre à lier des objets à différents types de contrôles. Dans ce cas, je souhaite que des exemples de données de mon objet apparaissent dans ComboBox. Le code s'exécute mais ce qui apparaît à la place des valeurs (David, Helen, Joe) est le texte "TheProtect.UserControls.Client")

XAML: (ucDataBindingObject.xaml)

<UserControl x:Class="TheProject.UserControls.ucDataBindingObject"
             xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.Microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             Width="Auto"
             Height="Auto"
             mc:Ignorable="d">

    <Grid Width="130"
          Height="240"
          Margin="0">

            <ComboBox Width="310"
                      HorizontalAlignment="Left"
                      VerticalAlignment="Top"
                      ItemsSource="{Binding Path=Clients}" />
    </Grid>
</UserControl>

C #: ucDataBindingObject.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Controls;
namespace TheProject.UserControls
{
    public partial class ucDataBindingObject : UserControl
    {

        public List<Client> Clients { get; set; }


        public ucDataBindingObject()
        {
            Clients = new List<Client>();
            Clients.Add(new Client(1, "David")); // sample data
            Clients.Add(new Client(2, "Helen"));
            Clients.Add(new Client(3, "Joe"));


            InitializeComponent();
            this.DataContext = this;
        }
    }

C # Client.cs

using System;
using System.Linq;

namespace TheProject.UserControls
{
    public class Client
    {
        public int ID { get; set; }
        public string Name { get; set; }

        public Client(int id, string name)
        {
            this.ID = id;
            this.Name = name;
        }
    }
}
32
Unrepentent Geek

Il y a plusieurs façons de dire au framework ce qu'il doit afficher

1) Utilisez DisplayMemberPath sur le ComboBox (cela affichera la propriété nommée):

<ComboBox ItemsSource="{Binding Path=Clients}" 
          DisplayMemberPath="Name"
/>

2) Définissez ItemTemplate sur le ComboBox. C'est comme # 1, sauf qu'il vous permet de définir un modèle à afficher, plutôt qu'une simple propriété:

<ComboBox ItemsSource="{Binding Path=Clients}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Border BorderBrush="Green" BorderThickness="1" Padding="5">
                <TextBlock Text="{Binding Path=Name,StringFormat='Name: {0}'}" />
            </Border>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

3) Ajoutez une substitution ToString() à la classe source. Utile si vous souhaitez toujours afficher la même chaîne pour une classe donnée. (Notez que la valeur par défaut ToString() est simplement le nom du type de classe, c'est pourquoi vous voyez "TheProtect.UserControls.Client".)

public class Client
{
    // ...

    public override string ToString()
    {
        return string.Format("{0} ({1})", Name, ID);
    }
}

4) Ajoutez un DataTemplate aux ressources XAML. Ceci est utile pour associer un type de classe donné à un modèle plus complexe ou stylisé.

<UserControl xmlns:local="clr-namespace:TheProject.UserControls">
    <UserControl.Resources>
        <DataTemplate DataType="local:Client">
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </UserControl.Resources>

    // ...

</UserControl>    
68
McGarnagle

Dans DisplayMemberPath, donnez le nom de la propriété que vous souhaitez afficher dans la comboBox. Dans SelectedValuePath, indiquez le nom de la propriété que vous souhaitez sélectionner. Lorsque vous faites un ComboBox.SelectedValue, vous obtiendrez la valeur de cette propriété.

9
Paranjay Srivastava