2012-03-21 11 views
0

私は何が間違っているか分かりません。何を試しても、グリッドは更新されません(空のままです)。ObservableCollectionへのDatagridバインディングはグリッドを更新しません

グリッドをObservableCollectionにバインドしたいが、自動クローンを作成するのではなく、このコレクションが保持する型であるProductというオブジェクトから2つのプロパティを選択する。

XAML:

<DataGrid x:Name="itemsGrid" ItemsSource="{Binding OrdersList}" AutoGenerateColumns="False" Style="{StaticResource GridStyle}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=Product.Amount}" Header="AMOUTN" /> 
     <DataGridTextColumn Binding="{Binding Path=Product.Name}" Header="NAME" /> 
    </DataGrid.Columns> 
</DataGrid > 

CODE:

public partial class Orders : Window,INotifyPropertyChanged 
    { 

     ObservableCollection<Product> _ordersList = new ObservableCollection<Product>(); 
     public event PropertyChangedEventHandler PropertyChanged; 

     private ObservableCollection<Product> OrdersList 
    { 
     get { return this._ordersList; } 

     set { _ordersList = value; NotifyPropertyChanged("OrdersList"); } 
    } 

    private void addProduct(Product p) 
    { 
     OrdersList.Add(p); 
     NotifyPropertyChanged("OrdersList"); 
    } 
    private void removeProduct(Product p) 
    { 
     OrdersList.Remove(p); 
     NotifyPropertyChanged("OrdersList"); 
    } 

    protected void NotifyPropertyChanged(String propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

}

答えて

2

私はあなたが単にあなたのバインディングから単語Product.を削除する必要があると思います。各DataGridRowDataContextはタイプProductの目的であるので、あなたは、あなたがどこかにthis.DataContext = this;を設定する必要がProduct

<DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding Path=Amount}" Header="AMOUNT" /> 
    <DataGridTextColumn Binding="{Binding Path=Name}" Header="NAME" /> 
</DataGrid.Columns> 
+0

これは解決しませんでした...アイテムを追加した後でもまだ空のグリッド – Programer

+1

@meyou 'ItemsGrid.DataContext = this;'をウィンドウのコンストラクタに追加してみてください。 'DataContext'が設定されていないようです。 'ItemsSource =" {Binding OrdersList、RelativeSource = {RelativeSource AncestorType = {x:Type Window}}} '' ''で、コレクションを取得する場所をバインディングに伝えるために 'ItemsSource'に' RelativeSource'バインディングを使うこともできます。 。ああ、 'OrdersList'プロパティを公開する – Rachel

+0

ありがとう、私はそれを解決しました。プロパティが公開されている場合にのみ、なぜ機能しますか? – Programer

0

上の性質を指している必要がありますバインディング。これは、ウィンドウのLoadイベントで行うのが最適です。

+0

Didn ' tも同様に動作します... – Programer

+1

'itemsGrid.ItemsSource = this._ordersList'はどうですか? –

関連する問題