2014-09-15 4 views
1

GridView에 데이터를 표시하는 데 문제가 있습니다. 나는 그것을 올바르게 얻는 것처럼 보이지 않으며 나는 이것에 관해서 다른 주제를 찾을 수 없었다. 아마도 나는 정말로 간단한 것을 감독 할 것입니다.데이터 바인딩 CollectionViewSource 및 GridView

<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)); 
     } 
    } 
} 

Mainpage 나는이 CollectionViewSource을 가지고

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

:

나는이있는 gridview을 가지고있다 :

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시 4분 - 16-09-2014 나는 바인딩은, 그가 NamesList을 찾을 수있는 좋은 것을 보여주기 위해이 디버깅 이미지를 추가했다. 그러나 itemsViewSource를 보면 Source가 null이라고합니다. ItemsViewSource Debugging

답변

0

나는 두 가지 대답을 발견했습니다.

대답 1 :

나는 Mainpage에서의 DataContext를 설정하고 그것을 참조 할 수 있습니다

는 단순히 < 페이지>

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

대답이이 추가 클래스 (내 경우에는 Person 클래스) (제 생각에는 논리적이지 않고 다음 코드 행을 설정하는 것이 더 쉽습니다.

itemsViewSource.Source = NamesList; 

다음과 같이 수정했습니다.

MainPage :이처럼 설정하면

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; 
    } 

내가 수 있어요 :

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

사람 클래스 (내가 데이터 클래스로이하면 더 볼 수 있습니다) (다음 추가) CollectionViewSource의 소스 바인딩을 올바르게 사용하는 방법. (원본 바인딩이 이전에 null 인 경우)

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

일반 List<T>을 사용하고 있으므로 WPF는 항목 추가 또는 제거시기를 알 수 없습니다.

대신 ObservableCollection<T>을 사용해보세요.

는 편집 :

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

방금 ​​InotifyPropertyChanged를 사용하여 ObservableCollection으로 변경 했으므로 질문을 편집합니다. – Sliver2009

+1

'NamesList'는 속성이 아닌 필드입니다. WPF는 속성에만 바인딩 할 수 있습니다. – GazTheDestroyer

+0

속성으로 변환했지만 여전히 표시되지 않습니다. (Windows 8.1 저장소 응용 프로그램입니다.) 어떻게 코드를 소스에서 NamesList로 설정할 때 작동합니까? (예를 들어 내 버튼 클릭 이벤트에서) – Sliver2009