1
votes

I'm learning WPF. Thanks in advance for the help.

I have an object, Directory, that acts as a container for a List of Person objects. I can't figure out why I can't bind my ListBox to the list of Person unless I set the DataContext directly. In other words, I can't use dot notation to access the list as a sub-property of the directory.

Observe the the last line of the C# sharp code below: I set the DataContext to this.directory.People and it works great.

But if I set the DataContext simply to this (to refer to the whole Window) and then try to use dot notation to set my binding like <ListBox ItemsSource="{Binding Path=directory.People}" /> my ListBox is blank.

XAML listed below. Observe the last line of the 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>
1

1 Answers

1
votes

WPF data binding works with public properties only. While directory is a public property (but should be named Directory), People is a public field.

Change

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

to

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