2012-05-12 1 views
2

저는 WPF를 처음 사용합니다. DataGrid 런타임에서 행을 삭제하려고합니다.이 행을 삭제하려고하면Wpf Datagrid 행 삭제 문제

Datagrid.Items.Remove (eRow);

오류가 발생합니다 : ItemsSource를 사용하는 동안 작업이 유효하지 않습니다. 대신 ItemsControl.ItemsSource를 사용하여 요소에 액세스하고 수정하십시오. "

ObservationCollection 및 InotifyPropertyChangedEvent를 사용할 수 있다고 온라인에서 읽었지만 구현 방법은 잘 모릅니다.

내가이

enter image description here

처럼 버튼을 제거해야이

<ctrls:RhinoDataGrid x:Name="dataGrid" Grid.Row="1" Margin="5" ItemsSource="{Binding Model.CurrentDataTable}" 
          Style="{StaticResource RhinoDataGridBaseStyle}" IsReadOnly="{Binding Model.IsLinkFile}" 
          SelectedValue="{Binding Model.CurrentDataRow}" SelectedValuePath="Row" 
           > 

      </ctrls:RhinoDataGrid> 

Pls는 저를 도와 데이터 그리드

입니다. 감사.

답변

5

DataGrid의 ItemsSource에는 Model.CurrentDataTable에 대한 바인딩이 있습니다. 행을 삭제하려면 해당 모음의 항목을 삭제해야합니다. 그러나 컬렉션에 INotifyCollectionChanged이 구현되어 있지 않으면 DataGrid는 해당 수정 사항을 알 수 없습니다.

.NET에 내장 된 ObservableCollection에는 INotifyCollectionChanged가 구현되어 있습니다. 이 컬렉션 형식을 CurrentDataTable에 사용하면 컬렉션이 수정 될 때 DataGrid 자체가 업데이트됩니다.

+0

ObservableCollection dtCollection = this.ItemsSource as ObservableCollection ; dtCollection.CollectionChanged + = 새 NotifyCollectionChangedEventHandler (dtCollection_CollectionChanged); 이 권리처럼? –

+0

음, 아니. 기본 데이터 목록 (원래 게시물의 Model.DataTable)은 ObservableCollection 이어야하며 XAML 코드의 바인딩 소스로 사용할 수 있습니다. 그런 다음 DataGrid는 목록의 CollectionChanged 이벤트에 자동으로 연결합니다. MSDN에서 Remarks와 Examples를 읽어보십시오. [데이터 바인딩 섹션] (http://msdn.microsoft.com/en-us/library/ms752347.aspx)도 도움이 될 것입니다. – rumpelstiefel

1

WPF 데이터 바인딩은 매우 드물게 사용자 인터페이스를 직접 조작한다는 것을 의미합니다. UI에서 그리드 컨트롤에서 행을 직접 제거하는 것이 Winforms에서 접근 한 방법입니다.

WPF 데이터 바인딩을 사용하면 사용자 인터페이스가 기본 데이터에 반응합니다. 따라서 귀하의 경우에는 격자가 바인딩에 지정된 ItemsSource의 내용에 바인딩됩니다 (또는 "시청") :

행을 삭제하려면 행을 삭제하려면 기본 데이터에서 제거해야하며 UI가 자동으로 반영됩니다 변화. 당신은 정말 당신이 WPF 개발을하고 있다면 그들을 읽을 필요가 -

이것은 ObservableCollectionINotifyPropertyChanged에 대해 모두 무엇인가!

+0

네가 절대적으로 옳다. 나는 그것을 성취하고자한다. 하지만 내 제거 버튼은 ICommand입니다. 그것을 어떻게 성취 할 수 있습니까? _removeSelectedRowCommand = 새 DelegateCommand (RemoveSelectedRow, true); private void RemoveSelectedRow() { DataView view = this.ItemsSource as DataView; view.Table.Rows [this.SelectedRowIndex].지우다(); this.Items.Refresh(); } –