2015-08-08 2 views
1

GridView Binding не работает. Не могли бы вы проверить, что мне не хватает? Я отправляю весь свой код для вашего удобства. Цель этого тестового кода заключается в том, что если я нажму кнопку «Добавить», класс лица будет добавлен в gridview.Связывание GridView не работает. Что мне не хватает?

C# код ниже ...

public partial class MainWindow : Window 
{ 
    List<Person> persons; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     persons = new List<Person>() { new Person() {Name="A", Age=20}, 
             new Person() {Name="B", Age=30}}; 

     lstView.ItemsSource = persons; 
    } 

    private void Add_Click(object sender, RoutedEventArgs e) 
    { 
     persons.Add(new Person { Name = tbName.Text, Age = Int32.Parse(tbAge.Text) }); 
    } 


} 

public class Person : INotifyPropertyChanged 
{ 
    private string name; 
    public string Name 
    { 
     get { return name; } 
     set 
     { 
      name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    private int age; 
    public int Age 
    { 
     get { return age; } 
     set 
     { 
      age = value; 
      OnPropertyChanged("Age"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
} 

И код XAML ..

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Width="525" Height="150"> 

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="50"/> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="30"/> 
     <RowDefinition Height="30"/> 
     <RowDefinition Height="30"/> 
     <RowDefinition Height="30"/> 
    </Grid.RowDefinitions> 
    <TextBlock Grid.Column="0">Name</TextBlock> 
    <TextBox Grid.Column="1" x:Name="tbName"></TextBox> 
    <TextBlock Grid.Column="0" Grid.Row="1">Age</TextBlock> 
    <TextBox Grid.Column="1" Grid.Row="1" x:Name="tbAge"></TextBox> 
    <Button Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Click="Add_Click"> Add </Button> 
    <ListView Grid.Column="2" Grid.RowSpan="4" x:Name="lstView"> 
     <ListView.View> 
      <GridView> 
       <GridView.Columns> 
        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/> 
        <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}"/> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View> 
    </ListView> 
</Grid> 

ответ

1

INotifyPropertyChanged предназначен для изменения объекта (в вашем случае каждый экземпляр Person).

Для прослушивания изменений в коллекции вам понадобится ObservableCollection (который реализует INotifyCollectionChanged), чтобы прослушать изменения в коллекции (в вашем случае новые и удаленные экземпляры Person в коллекции).

Представляет собой динамический сбор данных, который предоставляет уведомления, когда элементы будут добавлены, удалены или обновлены весь список. более

Информация here

+0

Спасибо. Я уже это знал. Но если я заставляю человека наблюдать, используя INotifyPropertyChanged, он должен работать. Я ошибаюсь ? – myoldgrandpa

+0

INotifyPropertyChanged уведомит вас об изменениях конкретного человека. То, что вы действительно хотите, должно быть уведомлено, когда в коллекцию добавляется новый человек. –

1

Вам нужен ObservableCollection не List

ObservableCollection<Person> persons; 
+0

Спасибо за ваш commet. Я уже пробовал, и он работает. Но теперь я углубляюсь в привязку и хочу, чтобы она работала без ObservableCollection. Не могу ли я заставить его работать только с использованием класса «INotifyPropertyChanged Person»? – myoldgrandpa

+0

он не будет работать без него – thumbmunkeys