2014-09-15 2 views
1

У меня проблема с отображением данных в GridView. Я не могу понять, что это правильно, и я не мог найти никаких других тем. Наверное, я наблюдаю за чем-то очень простым.Связывание данных CollectionViewSource и GridView

Я получил этот GridView:

<GridView ItemsSource="{Binding Source={StaticResource itemsViewSource}}" Width="383" Height="216"/> 
<Button Content="Button" Click="Button_Click" /> 

Я получил эту CollectionViewSource:

<Page.Resources> 
    <CollectionViewSource x:Name="itemsViewSource" Source="{Binding NamesList, Mode=TwoWay}"/> 
</Page.Resources> 

и этот код позади:

лицо Класс:

public class Person : INotifyPropertyChanged { 
    private string m_name; 
    private string m_gender; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string Name { 
     get { 
      return m_name; 
     } 
     set { 
      m_name = value; 
      RaisePropertyChanged("Name"); 
     } 
    } 
    public string Gender { 
     get { 
      return m_gender; 
     } 
     set { 
      m_gender = value; 
      RaisePropertyChanged("Gender"); 
     } 
    } 
    protected void RaisePropertyChanged(string PropertyName) { 
     var eventhandler = this.PropertyChanged; 
     if (eventhandler != null) { 
      eventhandler(this, new PropertyChangedEventArgs(PropertyName)); 
     } 
    } 
} 

Главная :

public sealed partial class MainPage : Page{ 
    public ObservableCollection<Person> NamesList {get; set;} 

    public MainPage(){ 
     this.InitializeComponent(); 

     Person p = new Person(); 
     Person p2 = new Person(); 
     Person p3 = new Person(); 

     p.Name = "Piet"; 
     p.Gender = "Male"; 
     p2.Name = "Pietin"; 
     p2.Gender = "Female"; 
     p3.Name = "Piet de tweede"; 
     p3.Gender = "Male"; 

     NamesList = new ObservableCollection<Person>(); 
     NamesList.Add(p); 
     NamesList.Add(p2); 
     NamesList.Add(p3); 
    } 

: private void Button_Click(object sender, RoutedEventArgs e) { 
     itemsViewSource.Source = NamesList; 
    } 
} 

Почему мой GridView не отображает данные или не добавляет данные на нажатия кнопок?

@edit 16:16 - 15-09-2014 Если после щелчка я добавляю следующее, он показывает элементы. Но это не так, как должно быть.

itemsViewSource.Source = NamesList; 

@edit 9:04 - 16-09-2014 Я добавил эту отладочную изображение, чтобы показать, что связывание хорошо, он может найти NamesList. Но если я посмотрю на itemsViewSource, он говорит, что Source имеет значение null. ItemsViewSource Debugging

ответ

0

Я нашел два ответа.

Ответ 1:

Просто добавьте к этому < страница>

DataContext="{Binding RelativeSource={RelativeSource Self}} 

Ответ 2:

я должен установить DataContext в MainPage и передать его класс (в моем случае класс Person) (По-моему, это не логично, и проще всего установить следующую строку кода:

itemsViewSource.Source = NamesList; 

Я применил следующие варианты адаптации:

MainPage:

public sealed partial class MainPage : Page{ 
    public MainPage(){ 
     this.InitializeComponent(); 
     DataContext = new Person(); 
    } 
} 

Person класса (Добавлено следующее) (я должен видеть это больше как класс данных):

public ObservableCollection<Person> NamesList { get; set; } 
    public Person() { 
     Person p = new Person("Piet", "Male"); 
     Person p2 = new Person("Pietin", "Female"); 
     NamesList = new ObservableCollection<Person>(); 
     NamesList.Add(p); 
     NamesList.Add(p2); 
    } 
    public Person(string Name, string Gender){ 
     m_name = Name; 
     m_gender = Gender; 
    } 

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

<CollectionViewSource x:Name="itemsViewSource" Source="{Binding NamesList, Mode=TwoWay}"/> 
2

Поскольку вы используете простой List<T>, WPF не имеет способа узнать, когда элементы будут добавлены или удалены.

Попробуйте вместо этого использовать ObservableCollection<T>.

EDIT:

NamesList должен быть свойством. WPF может связываться только со свойствами:

public sealed partial class MainPage : Page 
{ 
    public ObservableCollection<Person> NamesList { get; private set; } 

    public MainPage(){ 
     this.InitializeComponent(); 
     Person p = new Person(); 
     Person p2 = new Person(); 

     p.Name = "Piet"; 
     p.Gender = "Male"; 
     p2.Name = "Pietin"; 
     p2.Gender = "Female"; 

     NamesList = new ObservableCollection<Person>(); 
     NamesList.Add(p); 
     NamesList.Add(p2); 
    } 
+0

Я просто изменил его на ObservableCollection с помощью функции INotifyPropertyChanged, я отредактирую вопрос. – Sliver2009

+1

'NamesList' - поле, а не свойство. WPF может привязываться только к свойствам. – GazTheDestroyer

+0

Я преобразовал его в свойство, но он все еще не отображается. (Это приложение для магазина Windows 8.1) Как получилось, когда я установил источник в коде справа на NamesList, он работает? (Например, при событии нажатия кнопки) – Sliver2009

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