Entwickler-Ecke

WPF / Silverlight - Datenbindung ComboBox


Christoph1972 - Mi 10.11.10 18:05
Titel: Datenbindung ComboBox
Hallo Leute,

ich möchte eine ComboBox an eine ObservableCollection binden.



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
class TypeList : ObservableCollection<string>
{
    public TypeList()
    {
        Add("Type1");
        Add("Type2");
        Add("Type3");
    }
}


Wenn ich es mit C# Code mache ist es ganz einfach:


C#-Quelltext
1:
comboBoxType.ItemsSource = myTypeList                    



Ich würde das Binding jedoch gerne mit XAML erledigen, das bekomme ich aber irgendwie nicht hin.

Was ist den hier nicht korrekt, bzw. was fehlt hier?


XML-Daten
1:
<ComboBox  ItemsSource="{Binding Source=myTypeList, Path=myTypeList}"...........                    


Theoretisch sollte doch:

XML-Daten
1:
<ComboBox  ItemsSource="{Binding Source=myTypeList}"...........                    

ausreichen.....


Trashkid2000 - Mi 10.11.10 19:28

Hallo,

user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:
Theoretisch sollte doch:

XML-Daten
1:
<ComboBox  ItemsSource="{Binding Source=myTypeList}"...........                    

ausreichen.....

Also, was ich mit meinen (noch wenigen) XAML-Kenntnissen weiss: man kann nur an Properties binden.

Irgendwo musst Du also eine Propery haben, an die Du binden kannst:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private TypeList typeList = null;
public TypeList TypeList 
  {
  get 
  {
    if (typeList == null)
      typeList = new TypeList();
    return typeList;
  } 
}
Das ganze liegt bei mir in der Code-behind von Window1. Das Fenster hat bei mir den Namen "window1":

XML-Daten
1:
<Window ... x:Name="window1">                    
So, wenn Du nun also die Property an die ComboBox binden willst, so sieht das also so aus:

XML-Daten
1:
 <ComboBox ItemsSource="{Binding Path=TypeList, ElementName=window1}"/>                    
Hoffe, es hat Dir geholfen!

LG, Marko


Christoph1972 - Mi 10.11.10 21:49

Hi,

die Items werden nicht angezeigt. Der Debugger zeigt mir, das die Items in der Collection vorhanden sind.

Hier das Root Node

XML-Daten
1:
2:
3:
4:
<Window x:Class="LHistory.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       x:Name="Test"


So sieht der Tag für die ComboBox aus:

XML-Daten
1:
<ComboBox  ItemsSource="{Binding ElementName=Test,Path=ThisTypeList}" .........                    



Hier die TypeList-Klasse

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public class TypeList
{
    public TypeList()
    {
        t.Add("Type1");
        t.Add("Type2");
        t.Add("Type3");
    }
    private ObservableCollection<string> t = new ObservableCollection<string>();
    public ObservableCollection<string> List { get { return t; } }
}


Diese instanziere ich dann via Property in MainWindow.xaml.cs//Hier zeigt mir der Debugger das die Collection Items enthält. Es muss also was mit dem Bindung faul sein.

C#-Quelltext
1:
2:
3:
4:
5:
private TypeList t = new TypeList();
public TypeList ThisTypeList
{
    get { return t; }
}


Kha - Mi 10.11.10 21:55

Du kannst Trashkid schlecht vorwerfen, dass du in der Zwischenzeit deinen Code geändert hast ;) ...

Quelltext
1:
{Binding ElementName=Test,Path=ThisTypeList.List}                    


PS: Stand kein Binding Error im Output-Fenster?


Christoph1972 - Do 11.11.10 00:38

Hi,

Vorwürfe wollte ich keine machen und habe ich auch nicht, oder? Ich habe meinen Code zwischenzeitlich verändert um zu einer Lösung zu kommen. Mir fehlte nur das .List, als ich es gesehen habe, habe ich Sch.... gedacht. Na ja, weiter gehts, aller Anfang ist schwer, oder wie war das?

Vielen Dank euch beiden für den Lösungsansatz!


[EDIT] Es stand kein Error im Output! Nicht mal wenn ich ein Object angebe das nicht exsistiert...