2008-11-22 15 views
8

Ich habe schon seit einiger Zeit meinen Kopf dagegen geschlagen. Ich bin mir nicht wirklich sicher, warum es nicht funktioniert. Ich bin immer noch ziemlich neu in diesem ganzen WPF-Geschäft.WPF Binding-Sammlung zu ComboBox und Auswahl eines Artikels

Hier ist meine XAML für die Combobox

<ComboBox 
    SelectedValuePath="Type.FullName" 
    SelectedItem="{Binding Path=Type}" 
    Name="cmoBox" /> 

Hier ist, was die ComboBox auffüllt (myAssembly ist eine Klasse I mit einer Liste der möglichen Typen erstellt)

cmoBox.ItemsSource = myAssembly.PossibleTypes; 

ich die Datacontext in einem übergeordneten Set Element der ComboBox im Code dahinter wie folgt:

groupBox.DataContext = listBox.SelectedItem; 

Ich möchte das bindin g um den richtigen "möglichen Typ" aus der Combobox auszuwählen. Es wählt nichts aus. Ich habe SelectedValue und SelectedItem versucht. Als ich den DisplayMemberPath des ComboBox zu einer anderen Eigenschaft änderte, änderte es, was angezeigt wurde, also weiß ich, dass es nicht vollständig gebrochen ist.

Irgendwelche Ideen ???

Antwort

11

Setzen Sie im XAML ItemsSource="{Binding}" und (im Code hinter) setzen Sie DataContext auf myAssembly.PossibleTypes.

+0

Hat super funktioniert! Danke –

+0

:) Ich habe es nicht getestet ... aber ich habe in letzter Zeit viel in WPF bekommen (aufgrund der Verwendung bei der Arbeit) ... Ich dachte, das war entweder 100% richtig oder weg. –

12

Sie könnten die Bindung auch in der XAML und nicht im CodeBehind einstellen (wir vermeiden den Code in unseren XAML-Seiten, wo immer es möglich ist). Ich gehe davon aus, dass myAssembly eine Eigenschaft auf Ihrem Code-Behind für die Steuerung und ist eine Instanz der Klasse MyAssembly ...

<UserControl 
    x:Class="MyNamespace.MyControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{Binding}"> 

    <ComboBox 
    Width="200" 
    ItemsSource="{Binding Path=myAssembly.PossibleTypes}" 
    SelectedValuePath="Type.FullName" 
    SelectedItem="{Binding Path=Type}" 
    Name="cmoBox" /> 
</UserControl> 

Es kann nur persönliche Präferenz, aber ich denke, es ist besser Praxis ist zu haben die Datenbindungen in der XAML, da es einfacher ist, zu sehen, an was jedes Steuerelement gebunden ist, ohne den Code-Behind durchgehen zu müssen. Wenn Sie aus dem Code auf Ihre ComboBox verweisen möchten, sollten Sie ihr im xaml eine Eigenschaft x: Name und nicht nur Name zuweisen.

-5

Ich stimme zu: Bindungen sollten in der XAML sein. Ich habe ... überhaupt nichts in den Code geschrieben. Datenquellen sind alle wiederverwendbare "Ressourcen".

(gut, OK, der Code-Behind-Konstruktor ruft InitializeComponent()).

+1

Sie haben diese Frage überhaupt nicht beantwortet. Sie haben nichts als Ihre irrelevante Präferenz hinzugefügt, um den Code nicht zu verwenden. Außerdem wurde die Frage bereits 18 Monate vor der Veröffentlichung Ihrer "Antwort" korrekt beantwortet. Aus diesen Gründen -1. – Sheridan

+0

@Sheridan: +1 für Kommentare, warum gibt es einen negativen Punkt. –