2010-05-07 2 views
1

Je veux afficher une fenêtre enfant qui contient une zone de liste déroulante avec plusieurs valeurs provenant de l'un des biens de la fenêtre enfant:Liaison d'un combobox en XAML à une propriété ChildWindow

public partial class MyChildWindow : ChildWindow 
{ 
    private ObservableCollection<MyClass> _collectionToBind = // initialize and add items to collection to make sure it s not empty... 

    public ObservableCollection<MyClass> CollectionToBind 
    { 
     get { return _collectionToBind; } 
     set { _collectionToBind = value; } 
    } 
} 

Comment lie-je en XAML mon combobox à la collection ComboBoxContent (les deux sont dans la même classe)? J'ai essayé plusieurs choses telles que:

<ComboBox x:Name="linkCombo" ItemsSource="{Binding Path=CollectionToBind }" DisplayMemberPath="Description"> 

Je n'ai pu le lier dans le code behind et voudrais apprendre la façon XAML de le faire.

Merci!

Répondre

0

Dans ce cas, j'utiliser une connexion ElementToElement comme ceci: -

<ComboBox x:Name="linkCombo" ItemsSource="{Binding Path=Parent.CollectionToBind, ElementName=LayoutRoot }" DisplayMemberPath="Description"> 

Vous donnez l'élément contenu du ChildWindow le x:Name de LayoutRoot (dans le modèle standard pour fenêtre enfant cela se fait pour toi). Par conséquent, vous pouvez lier à cet élément nommé et accédez au contenant ChildWindow en utilisant sa propriété Parent. Utiliser DataContext = this est tentant et fonctionne dans des scénarios simples, mais les choses peuvent devenir gênantes dans des conditions plus complexes lorsque le DataContext a déjà été pris de cette façon.

+0

Merci! Fonctionne comme un charme! –

0

Vous devez définir le DataContext du ChildWindow à ce que contient les valeurs que vous souhaitez lier. Dans ce cas où vous mettez les valeurs que vous souhaitez lier le ChildWindow elle-même si il suffit de mettre une ligne dans le constructeur attribué DataContext à lui-même.

DataContext = this; 
0

Vous pouvez aussi le faire en utilisant un RelativeSource liant dans le XAML, comme ceci:

{Binding Path=CollectionToBind, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}} 

Cependant, une meilleure façon de le faire serait de mettre le CollectionToBind dans une catégorie distincte et l'affecter à la Window DataContext. Maintenant, à la fois la fenêtre et les liaisons XAML peuvent tous se référer à la même classe que le DataContext et vous pouvez isoler plus de votre logique dans cette classe plutôt que de le mettre dans la mise en œuvre de la fenêtre.

+0

Je crois que FindAncestor est WPF, et non Silverlight. –

+0

D'oh! Il me manque toujours le tag Silverlight. –

Questions connexes