2011-07-01 10 views
0

각 행에 두 개의 단추가있는 DataGrid가 있습니다. 하나는 행을 위로 이동하고 다른 하나는 행을 아래로 이동하는 것입니다.WPF의 DataGrid 행 문제

각 버튼에는 사용자가 선택한 행을 어느 방향 으로든 움직일 수있는 명령이 있습니다. 내가 직면하고있는 문제는 그것이 작동하지 않는다는 것입니다. 내가 가진 문제는 행의 다른 컨트롤 (콤보 상자)이 MVVM 모델을 통해 데이터 소스에 바인딩된다는 것입니다.이 MVMS 모델에서는 XAML의 코드에서 행이 논리적 인 위치라고 생각합니다. 그것을 할 수 있습니다.

내가 버튼 중 하나가 코드

은 다음과 같습니다 :

private void MoveRowDown(object sender, ExecutedRoutedEventArgs e) 
     { 

      int currentRowIndex = dg1.ItemContainerGenerator.IndexFromContainer(dg1.ItemContainerGenerator.ContainerFromItem(dg1.SelectedItem)); 

      if (currentRowIndex >= 0) 
      { 
       this.GetRow(currentRowIndex + 1).IsSelected = true; 
      } 


     } 
private DataGridRow GetRow(int index) 
     { 
      DataGridRow row = (DataGridRow)dg1.ItemContainerGenerator.ContainerFromIndex(index); 
      if (row == null) 
      { 
       dg1.UpdateLayout(); 
       dg1.ScrollIntoView(selectedAttributes.Items[index]); 
       row = (DataGridRow)dg1.ItemContainerGenerator.ContainerFromIndex(index); 
      } 
      return row; 
     } 

답변

0

당신은 데이터 그리드에 대한 CollectionView을 조작해야합니다. CollectionView는 데이터가 기본적으로 어떻게 보이는지를 담당합니다. 여기에 작은 예입니다 :

하는의 당신이 당신의 DataGridObservableCollection<T>에 이름 항목을 구속하고, 한 가정하자 T 정렬되는 색인라는 속성을 가지고있다.
은 다음과 같이 당신의 ViewModel에서 ICollectionView를 초기화 :

private ICommand upCommand; 
public ICommand Up 
{ 
    get { return upCommand ?? (upCommand = new RelayCommand(p => MoveUp())); } 
} 

private void MoveUp() 
{ 
    var current = (Item)view.CurrentItem; 
    var i = current.Index; 
    var prev = Items.Single(t => t.Index == (i - 1)); 
    current.Index = i - 1; 
    prev.Index = i; 
    view.Refresh(); //you need to refresh the CollectionView to show the changes. 
} 

경고 :

private ICollectionView cvs; 

ctor(){ 
    /*your default init stuff*/ 
    /*....*/ 

    cvs = CollectionViewSource.GetDefaultView(items); 
    view.SortDescriptions.Add(new SortDescription("Index",ListSortDirection.Ascending)); 
} 

이제 (또한 당신의 ViewModel에서) 위 명령에 버튼 명령을 결합 할 수 당신이이 이전 항목이 있는지 확인하기 위해 검사를 추가하십시오. 또는 항목의 색인을 확인하고 단추를 활성화/비활성화하는 CanExecute 대리자를 지정할 수 있습니다.

바인딩과 같이 당신이 버튼에 명령 (조쉬 스미스/칼 Shifflett의 RelayCommand 예의는 더 이상 올바른 링크를 찾을 수 없습니다) (창문의 DataContext에 당신의 ViewModel입니다 가정) :

<DataGridTemplateColumn > 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Button Content="Up" 
        Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, 
        Path=DataContext.Up}"/> 
    </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

희망이 도움이됩니다.

+0

감사합니다.하지만 MVMS 패턴을 통해 관찰 가능한 클래스 컬렉션에서 move 메서드를 사용하여 몇 줄의 코드에서 다른 작업을 수행했습니다. – Andy5