2010-07-30 1 views
1

Je suis nouveau sur WPF et j'essaye de comprendre tout ce truc de databinding. Quand je fais ce qui suit dans mon code, mon ComboBox est renseigné lorsque je lance mon application:WPF newbie - le paramétrage de ItemsSource en XAML ne semble pas fonctionner

public NewForm() 
{ 
    InitializeComponent(); 
    Product.ItemsSource = Products; 
} 

public List<string> Products 
{ 
    get { return _productsComponents.Keys.ToList(); } 
} 

Cependant, dans mon XAML quand j'ai ce qui suit, le ComboBox n'a pas de contenu en elle quand je lance ma demande:

<ComboBox Height="23" HorizontalAlignment="Left" Margin="138,116,0,0" 
      Name="Product" VerticalAlignment="Top" Width="120" 
      ItemsSource="{Binding Path=Products}"/> 

Est-ce que je fais référence à quelque chose de façon incorrecte? This tutorial était utile, mais il n'a jamais défini ItemsSource en XAML, toujours en C#.

Répondre

3

Par défaut, vous êtes en train de se lier pas à la forme elle-même, mais à l'objet assigné à la propriété DataContext. Cela facilite l'utilisation d'un modèle de vue pour gérer toutes les données en dehors des fichiers codebehind.

Vous pouvez probablement affecter la forme elle-même à la propriété DataContext dans le constructeur

DataContext = this; 

Vous pouvez également se lier à la forme de plusieurs manières. Voici un:

<Window x:Name="thisWindow" … 
    <ComboBox ItemsSource="{Binding Path=Products, ElementName=thisWindow}"… 

Je ne pense que Products doit être un DependencyProperty, mais ne me citez pas là-dessus, et aussi longtemps que la collection ne sont pas sujets à changement, vous n Pas besoin de s'inquiéter des notifications de mise à jour.

+0

Avoir '' me donne toujours un ComboBox vide quand j'exécute l'application. :( –

+0

Ooh, en mettant 'DataContext = this;' dans mon constructeur a fonctionné quand j'ai juste ' 'dans le code XAML. Merci! –

+0

@Sarah In Dans le premier cas, avez-vous assigné le nom "thisWindow" dans l'élément Window? 'x: Name =" thisWindow "' – Jay

0

Essayez binding Source = Produits

Path est généralement une source sur addendas de la façon dont je l'ai utilisé, il est pour quand vous avez besoin d'accéder à une sous des éléments disponibles dans la source.

Voici un exemple de ListBox que j'ai rempli d'éléments d'un XDocument stockés dans les ressources statiques. Cela pourrait expliquer la relation entre la source de liaison et le chemin. Root.Elements est le chemin d'accès membre d'une collection située en retrait du document XDocument référencé dans la source. N'utilisez pas le mécanisme {StaticResource Product} dans le vôtre car vous n'avez pas votre collection dans l'application xaml, mais plutôt dans la classe actuelle.

<ListBox Height="660" Name="ResponsesListBox" Width="240" 
         MouseDoubleClick="ResponsesListBox_MouseDoubleClick" 
         MouseLeftButtonDown="WindowMoveHandler" 
         ItemsSource="{Binding Source={StaticResource ResponsesXDocument}, Path=Root.Elements}" 
         ItemTemplate="{StaticResource ListBoxDataTemplate}" /> 

également à portée de main est ce Cheat Sheet Data Binding WPF, je l'ai trouvé très utile: http://www.nbdtech.com/Blog/archive/2009/02/02/wpf-xaml-data-binding-cheat-sheet.aspx

+0

Er, qui provoque ma ComboBox dans l'application pour contenir 'p' éléments de la liste, 'r', 'o', 'd', 'u', « c ',' t ',' s '. :( –

0

Je suggérerais d'essayer de me limiter soit à garder la configuration de liaison en code ou en XAML, ne pas les mélanger. Dans votre situation, vous définissez le ItemsSource lors de la création du formulaire ET en XAML. Je ne suis pas sûr pourquoi?

De toute façon, il semble que vous êtes '_productsComponents' est un dictionnaire par votre code. Donc, je vais l'utiliser à mon avantage dans une meilleure version de code:

code-behind:

public partial class NewForm : Window 
{ 
    private Dictionary<String, String> _productsComponents; 
    public Products 
    { 
     get { return _productsComponents; } 
     set { _productsComponents= value; } 
    } 

    public NewForm() 
    { 
     Products = new Dictionary<String, String>(); 
     //Do you're dictionary loading... 

     InitializeComponent(); 

     DataContext = this; 

     ProductCmbBox.ItemsSource = Products; 
     ProductCmbBox.SelectedValuePath = "Key"; 
     ProductCmbBox.DisplayMemberPath = "Value"; //or "Key" if you want... 
    } 
} 

<ComboBox x:Name="ProductCmbBox" ... /> 

Je regarde aussi dans: Dr. WPF's ObservableDictionary. Cela vous permet de vous assurer que si les éléments du dictionnaire changent, vous serez en mesure d'observer ce changement (c'est-à-dire, si vous supprimez/ajoutez un keyvaluepair de votre dictionnaire que vous êtes combobox) montrez la liste correcte toujours).

+0

Oh, et si vous êtes nouveau sur WPF, je chercherais à prendre un livre si vous venez d'une autre langue ... ajuster la façon dont WPF fait les choses est un peu une courbe d'apprentissage. J'ai récupéré Pro WPF en C# 2010. On dit Pro, mais ce n'est pas trop complexe. Livre + StackOverflow + Site web Dr. WPFs = excellent moyen de récupérer WPF. –

3

Mettre DataContext="{Binding RelativeSource={RelativeSource Self}}" dans la fenêtre:

<Window x:Class="ListViewTest.Test2.ListViewTest" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}"