2017-05-20 34 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が言ったこと。さらに、もう1つの重要なことは、コレクション(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> 
関連する問題