2017-04-04 5 views
2

私はMVVMを使用して私の最初のアプリをやっています。私は、 "ビュー"で宣言されたDatagridを持っています。コードXAML以下:MVVMを使用してDataGridから選択した項目に関する情報を渡す方法

私のViewModelクラスで
  <DataGridTemplateColumn Header="delete"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Button 
          Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type> UserControl},Mode=FindAncestor}, Path=DataContext.ClickCommand}">         Content="X" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns>> 
    </DataGrid> 

私はコードの一部で、私は "削除" クリックボタンの後に欲しい機能を実行することができます。

public ICommand ClickCommand => _clickCommand ?? (_clickCommand = new CommandHandler(Delete, _canExecute)); 
    public void Delete() 
    { 
    // DataTable.Rows.RemoveAt(); 
    } 

selectet行のインデックスを取得できないため、問題があります。 DataGridのデータソースはdataTableです。

どうすればいいですか?

ボタンのコマンドでパラメータを渡して何かを試しましたが、動作させることができませんでした。

+0

CMDそれも笑えるなってきた:行2のボタンをクリックしながら、あなたは1行を選択することができます - ので、あなたがより良い行毎に存在するボタン用に選択された行に依存しません。 – grek40

答えて

3

のXmaIコード

<Button Command="{Binding Path=DataContext.ViewCommand,RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" CommandParameter="{Binding Id}" Content="X" Background="Chocolate"/> 

分離コードコード

public RelayCommand DeleteCommand 
{ 
    get 
    { 
     return new RelayCommand(p => Delete(p)); 
    } 
} 

public void Delete(string id) 
{ 
// DataTable.Rows.RemoveAt(); 
} 

これは、あなたがそのCMDパラメーターで好き渡すことができます例です。

リレー

public class RelayCommand : ICommand 
{ 
    private Action<object> action; 
    private Func<bool> canFuncPerform; 
    public event EventHandler CanExecuteChanged; 
    public RelayCommand(Action<object> executeMethod) 
    { 
     action = executeMethod; 
    } 
    public RelayCommand(Action<object> executeMethod, Func<bool> canExecuteMethod) 
    { 
     action = executeMethod; 
     canFuncPerform = canExecuteMethod; 
    } 
    public void RaiseCanExecuteChanged() 
    { 
     CanExecuteChanged(this, EventArgs.Empty); 
    } 
    public bool CanExecute(object parameter) 
    { 
     if (canFuncPerform != null) 
     { 
      return canFuncPerform(); 
     } 

     if (action != null) 
     { 
      return true; 
     } 

     return false; 
    } 


    public void Execute(object parameter) 
    { 
     if (action != null) 
     { 
      action(parameter);     
     } 
    } 
} 
+0

ViewModelのIcommand IDプロパティも正しく実装する必要がありますか? – Vades

+0

お時間をありがとう。私は自分のプロジェクトにそれを実装しました。削除機能を に変更する必要がありました。 'public void Delete(オブジェクトID) { // DataTable.Rows.RemoveAt(); とボタンの説明: ' 実際に引数を渡しても、削除したいRowに関する情報はありません。すべてのDataGridに関する情報しかありません。私は何をすべきか考えていますか? – Vades

+0

Idプロパティは行オブジェクトに属します。データグリッドのitemsSourceを確認するだけです。例: - は次のようになります。 –

1

選択したアイテムに頼るべきではありません。代わりCommandParameter現在行項目を渡す:

<DataGridTemplateColumn Header="delete"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Button 
       Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl},Mode=FindAncestor}, Path=DataContext.ClickCommand}" 
       CommandParameter="{Binding}" 
       Content="X" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

そしてもちろん、コマンドパラメータを破棄し、削除する行を識別するために使用されていないICommand実装を使用します。

+0

あなたはその実装を少し助けてくれますか? 私はDelete()メソッドをインデントするようなものを試していますが、うまくいきません。 – Vades

+0

@Vadesあなたが 'CommandHandler'についての詳細を提供しておらず、標準の.Netクラスではないので、私はできません。また、raghavaの答えを見て、それはパラメータとしてidの値を使用するとかなり近いはずです。それはあなたのviewmodelデータテーブルに含まれる列に依存します。 – grek40

関連する問題