2011-07-01 18 views
0

私は各行に2つのボタンがあり、1つは行を上に移動し、もう1つは行を下に移動するデータグリッドを持っています。WPFのDataGridの問題

各ボタンには、ユーザーが選択した行をどちらの方向にも移動できるようにするコマンドがあります。私が直面している問題は、それが機能していないということです。私の問題は、行の他のコントロール(コンボボックス)が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

あなたは、DataGridのCollectionViewを操作する必要があります。 CollectionViewは、データが基本的にどのように見えるかを担当します。ここで小さな例です:

のは、あなたがアイテムという名前ObservableCollection<T>にごDataGridを拘束しました仮定、および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. 
} 

WARNING:

private ICollectionView cvs; 

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

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

は今、あなたは(も、あなたのViewModelで)アップコマンドにあなたのボタンコマンドをバインドすることができあなたが持っています前のアイテムがあるかどうかを確認するためのチェックを追加するか、アイテムのインデックスをチェックしてボタンを有効または無効にするCanExecuteデリゲートを指定することもできます。
(ジョシュ・スミス/カール・ShifflettのRelayCommand礼儀、もはや正しいリンクを見つけることができません)

バインドこのようなあなたのボタンにコマンド(あなたのviewmodelがあなたの窓の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パターンを使って観測可能なクラスコレクションのmoveメソッドを2行のコードで使用して、もう一度やりました – Andy5