2011-07-01 91 views
0

我有一个datagrid,每行有两个按钮 - 一个用于向上移动一行,另一个用于向下移动一行。DataGrid在WPF中的问题

每个按钮都有一个允许用户在任一方向移动选定行的命令。我面临的问题是它无法正常工作。我认为我可能遇到的问题是行上的其他控件(组合框)通过MVVM模型绑定到数据源,我在这里操纵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为DataGrid。 CollectionView负责基本上你的数据的外观。这里是一个小例子:

让我们假设你已经绑定您的DataGridObservableCollection<T>命名项目,并T有一个名为指数上排序属性。
初始化您的视图模型的ICollectionView这样的:

private ICollectionView cvs; 

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

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

现在,您可以将您的按钮命令绑定到命令(在视图模型也):

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. 
} 

警告:你必须添加检查以查看是否存在先前的项目等。或者,您可以指定一个CanExecute委派,它检查项目的索引并启用/禁用该按钮。
RelayCommand礼貌约什 - 史密斯/卡尔Shifflett的,无法找到了正确的链接)

绑定命令,这样你按钮(假设你的视图模型是你的窗口的DataContext):

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

希望这有助于!

+0

谢谢,但我最后通过在几行代码中通过MVVM模式在observable类集合上使用move方法做了另一个操作 – Andy5