Un bien meilleur moyen consiste à lier votre liste à un objet que vous créez. De cette façon, vous pouvez spécifier des propriétés pour DisplayMemberPath (ce que vous voyez) et SelectedValuePath (valeur interne de votre programme).
Voici votre code XAML principal. Notez que la méthode de clic du bouton affichera la valeur actuellement sélectionnée de la ComboBox. Cela va faciliter les choses plus tard. J'espère que ce n'est pas exagéré mais cela montre quelques principes qui rendent WPF facile.
namespace WPFListBoxSample {
public partial class Window1 : Window
{
WPFListBoxModel model = new WPFListBoxModel();
public Window1()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Window1_Loaded);
}
void Window1_Loaded(object sender, RoutedEventArgs e)
{
GetData();
this.DataContext = model;
}
public void GetData()
{
//SqlConnection myConnection = new SqlConnection("Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "ProgramsList.sdf");
SqlConnectionStringBuilder str = new SqlConnectionStringBuilder();
str.DataSource="192.168.1.27";
str.InitialCatalog="NorthWnd";
str.UserID="sa";
str.Password="xyz";
SqlConnection myConnection = new SqlConnection(str.ConnectionString);
SqlDataReader myReader = null;
myConnection.Open();
SqlDataReader dr = new SqlCommand("SELECT CategoryId, CategoryName FROM Categories ORDER BY CategoryName DESC", myConnection).ExecuteReader();
while (dr.Read())
{
model.Categories.Add(new Category { Id = dr.GetInt32(0), CategoryName = dr.GetString(1) });
}
myConnection.Close();
}
private void myButton_Click(object sender, RoutedEventArgs e)
{
if (this.myCombo.SelectedValue != null)
MessageBox.Show("You selected product: " + this.myCombo.SelectedValue);
else
MessageBox.Show("No product selected");
}
}
}
Le XAML
<Grid>
<StackPanel>
<ComboBox x:Name="myCombo" ItemsSource="{Binding Categories}" DisplayMemberPath="CategoryName" SelectedValuePath="Id" />
<Button x:Name="myButton" Content="Show Product" Click="myButton_Click"/>
</StackPanel>
</Grid>
Votre propre objet pour représenter une catégorie
namespace WPFListBoxSample
{
public class Category
{
public int Id { get; set; }
public string CategoryName { get; set; }
}
}
Notez le {get; set;}
Enfin un peu de colle qui rend beaucoup de choses faciles est de mettre toutes vos données dans un modèle et de lier le modèle. C'est la façon de travailler WPF.
using System.Collections.Generic;
namespace WPFListBoxSample
{
public class WPFListBoxModel
{
private IList<Category> _categories;
public IList<Category> Categories
{
get
{
if (_categories == null)
_categories = new List<Category>();
return _categories; }
set { _categories = value; }
}
}
}
j'ai enfin trouvé la réponse, et le garçon, était-je bête! J'utilisais SQL Server dans mon code backend, qui est un framework pour les applications client-serveur en réseau, alors que j'aurais dû utiliser SQL Compact Edition pour les programmes de bureau locaux! Ce que je n'ai pas réalisé, c'est que MDF est pour SQL Server et SDF pour MDF. Peu importe, j'ai combiné le code de Nate et de stratton et les ai modifiés pour travailler avec SQL CE. Merci à tous pour votre aide! –
Ici, si vous devez charger une valeur de chaîne, vous devez mettre 'dr.GetString (1)'.Soit si vous avez besoin de charger une valeur int, vous devez mettre 'dr.GetInt32 (0)'. Cela a fonctionné pour moi. [Cochez ici !!] (https://stackoverflow.com/questions/38032750/error-unable-to-cast-object-of-type-system-int32-to-type-system-string/44644672#44644672) – User6667769