2017-01-29 2 views
1

Я изучаю WPF. Заранее спасибо за помощь.WPF: может связываться только с List, если DataContext установлен непосредственно

У меня есть объект, Directory, который выступает в качестве контейнера для списка Person объектов. Я не могу понять, почему я не могу привязать свой список ListBox к списку Person, если я не установил DataContext напрямую. Другими словами, я не могу использовать точечную нотацию для доступа к списку в качестве под-свойства каталога.

Обратите внимание на последнюю строку кода C#, приведенный ниже: Я установил DataContext в this.directory.People, и он отлично работает.

Но если я установил DataContext просто this (чтобы обратиться ко всему окну), а затем попытайтесь использовать точечную нотацию, чтобы установить привязку, как <ListBox ItemsSource="{Binding Path=directory.People}" />, мой ListBox пуст.

XAML, указанный ниже. Обратите внимание на последнюю строку 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

WPF привязка данных работает только с открытыми свойствами. Хотя directory является общедоступной собственностью (но должно называться Directory), People является общедоступным.

Изменить

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

в

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

Спасибо. Я уже знал это, и, наверное, я просто пропустил это. Отрывал мои волосы. Приветствия. – MH175

Смежные вопросы