2017-05-20 4 views
1

안녕하십니까.사용자 정의 DataGrid의 ItemsSource 만들기 - 작동하지 않습니다.

Create a custom DataGrid's ItemsSource에서 솔루션을 복제하려고하는데 행이 채워지지 않습니다.

열은 올바른 머리글과 함께 표시되지만 눈금에는 데이터가 표시되지 않습니다.

저는 WPF와 XAML에서 새로운 사람이라면 누구나 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까?

using System; 
using System.Windows; 
using System.ComponentModel; 
using System.Collections.ObjectModel; 
using System.Runtime.CompilerServices; 

namespace WPFBindingDataGridTest2 
{ 
    public partial class MainWindow : Window 
    { 
     public ObservableCollection<MyObject> myList { get; set; } 

     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = this; 

      testClass = new ObservableCollection<TestClass>(); 
      testClass.Add(new TestClass(NameValue: "John")); 
      testClass.Add(new TestClass(NameValue: "Frank")); 
      testClass.Add(new TestClass(NameValue: "Sarah")); 
      testClass.Add(new TestClass(NameValue: "David")); 


     } 
    } 

    class TestClass : INotifyPropertyChanged 
    { 
     private string name; 

     public TestClass(string NameValue) 
     { 
      this.Name = NameValue; 
     } 

     public String Name 
     { 
      get { return name; } 
      set { this.name = value; NotifyPropertyChanged(); } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

그리고 XAML

...

<Grid> 
    <DataGrid x:Name="dataGrid" ItemsSource="{Binding testClass}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

내가 점점 오전 오류가 나는 이것에 너무 가까이 나는 것 같은 느낌,하지만 한 가지를 놓치고

System.Windows.Data Error: 40 : 
BindingExpression path error: 
'testClass' property not found on 'object'''MainWindow' 
(Name='')'.BindingExpression: 
Path=testClass; 
DataItem='MainWindow' (Name=''); 
target element is 'DataGrid' (Name='dataGrid'); 
target property is 'ItemsSource' (type 'IEnumerable') 

입니다.
데이터 컨텍스트가 잘못되었을 수 있습니까?

+1

속성 이름은 대소 문자를 구분합니다. 바인딩에서 MyId를 MyID로 변경하십시오. 출력 창에 바인딩 오류가 있어야합니다. – Yevgeniy

+0

예브게니 (Yevgeniy)의 말. 그러나 또 다른 중요한 점은 컬렉션 (myList)에 대한 바인딩에이 속성의 값이 변경되었음을 알리는 것 (즉, ObservableCollection 객체를이 속성에 할당 한 경우)입니다. 따라서 어떤 효과도 보이지 않습니다. – elgonzo

+2

ObservableCollection 속성을 선언하고 초기화하는 ViewModel 클래스를 만드는 것이 좋습니다. ViewModel 클래스를 DataContext로 사용하십시오. ViewModel 클래스의'INotifyPropertyChanged' 인터페이스에 임 플린팅하십시오. ViewModel의 모든 속성에 대한 설정자에서 PropertyChanged 이벤트를 발생시킵니다. 이런 식으로 바인딩은 변경 될 바인딩 된 속성이있을 때마다 알려줍니다. – elgonzo

답변

1

DataContext를 할당 할 때 myListnull입니다. MyId (

public MainWindow() 
{ 
    myList = new ObservableCollection<MyObject> 
    { 
     new MyObject() { MyID = "6222" }, 
     new MyObject() { MyID = "12" }, 
     new MyObject() { MyID = "666" } 
    }; 
    this.DataContext = this; 
    InitializeComponent(); 
} 

도 열 바인딩() 또는 속성 이름을 수정 :이 나중에 생성되면, 속성은

빠른 수정 작업의 순서를 변경하는 것입니다 (이벤트를 통해) 변경에 대한보고하지 않습니다) 경로를 바인딩 속성 이름

일치하지만 내가 myList 속성) INotifyPropertyChanged를 구현하는 별도의 클래스를 (생성하고 윈도우의 DataContext을 설정) 클래스 (보기 모델의 인스턴스를 사용하는 것이 좋습니다해야하기 때문이다.

+0

나는 코드를 변경했으며 그것이 작동하도록하는 것에 가깝다고 생각합니다. –

0

알아 냈습니다.

using System; 
using System.Windows; 
using System.ComponentModel; 
using System.Collections.ObjectModel; 
using System.Runtime.CompilerServices; 

namespace WPFBindingDataGridTest2 
{ 
    public partial class MainWindow : Window 
    { 
     private ObservableCollection<TestClass> testClass; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      testClass = new ObservableCollection<TestClass>(); 
      testClass.Add(new TestClass(NameValue: "John")); 
      testClass.Add(new TestClass(NameValue: "Frank")); 
      testClass.Add(new TestClass(NameValue: "Sarah")); 
      testClass.Add(new TestClass(NameValue: "David")); 

      // this.DataContext = this does not appear to be nessecary if it the class is stored in the main window 
      dataGrid.ItemsSource = testClass; 

     } 
    } 

    class TestClass : INotifyPropertyChanged 
    { 
     private string name; 

     public TestClass(string NameValue) 
     { 
      this.Name = NameValue; 
     } 

     public String Name 
     { 
      get { return name; } 
      set { this.name = value; NotifyPropertyChanged(); } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

XAML

<Window x:Class="WPFBindingDataGridTest2.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:local="clr-namespace:WPFBindingDataGridTest2" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <DataGrid x:Name="dataGrid" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
      </DataGrid.Columns> 
     </DataGrid> 

    </Grid> 
</Window> 
관련 문제