2017-01-29 2 views
1

Ich lerne WPF. Vielen Dank im Voraus für die Hilfe.WPF: Kann nur an List binden, wenn DataContext direkt gesetzt

Ich habe ein Objekt, Directory, das als Container für eine Liste von Person Objekte dient. Ich kann nicht herausfinden, warum ich meine ListBox nicht an die Liste der Person binden kann, außer wenn ich den DataContext direkt einstelle. Mit anderen Worten, ich kann die Punktnotation nicht verwenden, um auf die Liste als Untereigenschaft des Verzeichnisses zuzugreifen.

Beobachten Sie die letzte Zeile des C# -Spitzencodes unten: Ich setze den DataContext auf this.directory.People und es funktioniert super.

Aber wenn ich den DataContext einfach auf this (auf das gesamte Fenster beziehen) und dann versuchen, Punktnotation zu verwenden, um meine Bindung wie <ListBox ItemsSource="{Binding Path=directory.People}" /> meine ListBox ist leer.

XAML unten aufgeführt. Beachten Sie die letzte Zeile des XAML.

Codebehind:

public class Person 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 

    public class Directory 
    { 
     public List<Person> People = new List<Person>(); 
     public Directory() 
     { 
      this.People.Add(new Person() { Name = "Joseph", Age = 34 }); 
      this.People.Add(new Person() { Name = "Teresa", Age = 29}); 
      this.People.Add(new Person() { Name = "Kulwant", Age = 66 }); 
      this.People.Add(new Person() { Name = "Hyunh", Age = 61}); 
      this.People.Add(new Person() { Name = "Marcio", Age = 65 }); 
     } 
    } 


    public partial class MainWindow : Window 
    { 

     public Directory directory { get; } = new Directory(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = this.directory.People; 
     } 

    } 

XAML:

<Window x:Class="WtfDataTrigger.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:t="clr-namespace:System.Threading;assembly=mscorlib" 
     xmlns:local="clr-namespace:LearningWPF" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 

     <DataTemplate DataType="{x:Type local:Person}"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="1*" /> 
        <RowDefinition Height="1*" /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="50" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 
       <Label Name="NameLabel" Margin="2" Content="Name" Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" FontWeight="Bold"/> 
       <TextBlock Name="NameText" Margin="2" Text="{Binding Path=Name}" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" /> 
       <Label Name="AgeLabel" Margin="2" Content="Age" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" FontWeight="Bold" /> 
       <TextBlock Name="AgeText" Margin="2" Text="{Binding Path=Age}" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center"/> 
      </Grid> 
     </DataTemplate> 

    </Window.Resources> 

    <StackPanel> 
     <ListBox ItemsSource="{Binding}" /> 
    </StackPanel> 

</Window> 

Antwort

1

WPF Daten funktioniert nur mit öffentlichen Eigenschaften verbindlich. Während directory eine öffentliche Eigenschaft ist (aber Directory genannt werden sollte), ist People ein öffentliches Feld.

ändern

public List<Person> People = new List<Person>(); 

zu

public List<Person> People { get; } = new List<Person>(); 
+0

Danke. Das wusste ich schon und ich denke, ich habe es einfach vermisst. Hat mir die Haare ausgerissen. Prost. – MH175

Verwandte Themen