2016-11-05 19 views
0

私はイベントを発生させるviewmodelに頼らざるを得ず、そのイベントをキャッチしてグリッド全体をリフレッシュしなければなりません。観察されないときに観察可能なもののポイントは何ですか?DataGridViewでObservableCollection <T>が表示されないのはなぜですか?

これは、メインフォームが最初のグリッドを埋める、起動、およびそれに何かをコレクションに追加されるたびに再増殖できるかです:

public ObservableCollection<FindMatchViewModel> FileInfos { get; set; } 
:クラス ViewModelオン

private void MainForm_Load(object sender, EventArgs e) 
{ 
    FoundFilesBindingSource.DataSource = ViewModel; 

    // TODO Try get rid of event model. 
    ViewModel.FilesFound += (o, args) => 
    { 
     if (FileInfosGrid.InvokeRequired) 
     { 
      FileInfosGrid.Invoke(new Action(() => FileInfosGrid.DataSource = ViewModel.FileInfos)); 
     } 
     else 
     { 
      FileInfosGrid.DataSource = ViewModel.FileInfos; 
     } 
    }; 
} 

FileInfosは次のように宣言されています

+1

代わりにBindingListを使用してみましたか? – nozzleman

+0

http://stackoverflow.com/questions/4284663/difference-between-observablecollection-and-bindinglistを参照してください。 – MSL

+0

解決済み[ここ](https://stackoverflow.com/questions/33623991/connect-listt-to-a-リストフォーム):•Windowsフォームで、バインドされたリストコントロール(複雑な双方向データバインディング)のデータソースの変更を表示するシナリオでは、 'IBindingList'を' DataSource'として実装するクラスを使用する必要があります。最も適切な実装は 'System.ComponentModel.BindingList 'です。 •一般的な間違いは、 'ObservableCollection'を使用しています。これは' IBindingList'を実装していないのでこの要件では機能しません。 –

答えて

1

IBindingListが実装されていないため、ObservableCollectionがdataGridViewで機能しません。代わりにBindingListを使用する必要があります。プロパティの変更を反映させる場合は、アイテムにINotifyPropertyChangedが実装されていることを確認してください。

問題はObservableCollectionがWpfコントロール用に設計されていることです。

BindingListは、データの並べ替えやフィルタリングをサポートしていないことに注意してください。この動作は、DataTableまたはカスタムのList実装でのみサポートされています。

+0

答えにはIMOの修正が必要な点がいくつかあります。• 'TreeView'はデータバインディングをサポートしていないので、ObservableCollectionにバインドできません。 •AllowEditはデフォルトでは 'true'です。 –

+0

@RezaAghaeiああありがとう。思考TreeViewはmsdnがこれを伝えているので動作します:https://msdn.microsoft.com/de-de/library/ms668604(v=vs.110).aspxしかし、彼らはWPF Treeviewを私は思います。 – Sebi

+0

はい、WPF ['TreeView']を意味します(https://msdn.microsoft.com/de-de/library/system.windows.controls.treeview(v = vs.110).aspx)。 –

関連する問題