2010-09-02 10 views
5

Ich schrieb einfachen Code wieListBox.ItemsSource in Code-Bindung und in XAML

public ObservableCollection<string> Names … 
public Window1() 
{ 
    PutInDataIntoNames(); 
    InitializeComponent(); 
    this.listBox1.ItemsSource = Names; 
} 

und in XAML

<Grid> 
    <ListBox Margin="10,11,10,16" 
     Name="listBox1" 
     Background="Black" 
     Foreground="Orange" 
     /> 
</Grid> 

Dann wollte ich Itemssource-Eigenschaft in XAML festlegen. Um das zu tun, schrieb ich folgendes:

ItemsSource="{Binding Path=Names}" 

Leider funktioniert es nicht. Können Sie erklären, warum und wie man das richtig macht?

Antwort

3

dies hinter

in Code tun
public Window1() 
{ 
    PutInDataIntoNames(); 
    InitializeComponent(); 
    DataContext = this; 
} 

und in XAML

<Grid> 
    <ListBox ItemsSource="{Binding Names}" 
     Margin="10,11,10,16" 
     Name="listBox1" 
     Background="Black" 
     Foreground="Orange" 
     /> 
</Grid> 

Idealerweise sollten Sie MVVM Design zu isolieren Daten aus dem Code hinter folgen. nur

+0

OK. aber ich würde es vorziehen, sie in XAML wie zu schreiben Es ist oft ein bisschen enttäuschend, dass manchmal dont't Ich muss explizit einrichten Datacontext während manchmal muss ich. –

8

Wenn Sie den Bindungspfad das Bindungsmodul angeben werden versuchen, den Pfad zu navigieren aus dem aktuellen DataContext beginnend so ist ItemsSource="{Binding Path=Names}" nicht arbeiten, gibt es eine Menge verschiedener Dinge im Auge zu behalten vor allem, wenn komplexere Dinge zu tun .

Der wichtigste Artikel, dass jeder, der zu Databinding neu lesen sollte die Data Binding Overview on MSDN

ist, um sich wieder auf Ihre Bindung, wenn Sie es vollständig in XAML tun, wollen Sie das auch tun können, die Sie gerade Sie müssen das Window zu Ihrer Quelle machen, indem Sie entweder direkt oder relativ darauf verweisen oder es als DataContext einrichten.

1 - Direkte Referenz:

<Window Name="Window" 
     ...> 
    <Grid> 
      <ListBox ... 
        ItemsSource="{Binding ElementName=Window, Path=Names}" 
        .../> 
    </Grid> 
</Window> 

2 - Relative Reference

<Grid> 
      <ListBox ... 
        ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Names}" 
        .../> 
    </Grid> 

3 - die Datacontext Einrichten

<Window ... 
     DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"> 
    <Grid> 
      <ListBox ... 
        ItemsSource="{Binding Path=Names}" 
        .../> 
    </Grid> 
</Window> 
3

Es scheint, dass Ihr Names ein Feld sein könnte. Sie können NUR an öffentliche Eigenschaften binden