2016-07-16 137 views
1

Prismフレームワークを使用してWPF MVVMソリューションを実装する。WPF MVVM - DataGridセルクリック、列ヘッダーを取得

DataGridまたはGridViewを使用して表形式のデータを表示します。 次に、セルをクリックすると、CommandとCommandParameterとして、ColumnHeaderのキャプションが発生します。 (デビットの場合のみ&クレジット列は以下のコードで表示されます)デビット項目をクリックすると、その項目に金額がコピーされ、クレジット項目をクリックするとデビット項目が表示されます。クリアされ、値はCreditフィールドにコピーされます)

試行されたDataGridのみ、選択したレコードをViewModelに戻すことができます。 GridViewを使用すると、GridViewColumnヘッダーにコマンドを添付するだけで管理できます。

ご協力いただければ幸いです。現時点で

、これは私のコードは次のようになります。

のViewModel:

public AccountingViewModel(IAccountingView view, IRegionManager manager, IEventAggregator eventAggregator) 
     :base(view, manager, eventAggregator) 
{    
     AccountingEntries = new ObservableCollection<AccountingModel>(); 
     FieldClickedCommand = new DelegateCommand<string>(OnClicked); 
} 

private void OnClicked(string column) 
{ 
    //Update corresponding field in record clicked cell 
} 

private AccountingModel _selectedAccount; 
public AccountingModel SelectedAccount 
{ 
    get { return _selectedAccount; } 
    set 
    { 
     _selectedAccount = value; 
     OnPropertyChanged("SelectedAccount"); 
    } 
} 

private ObservableCollection<AccountingModel> _accountingEntries; 
public ObservableCollection<AccountingModel> AccountingEntries 
{ 
    get { return _accountingEntries; } 
    set 
    { 
     _accountingEntries = value; 
     OnPropertyChanged("AccountingEntries"); 
    } 
} 

ビュー:

<Grid x:Name="AccountingViewModelLevel"> 

    <DataGrid Grid.Row="1" 
       ItemsSource="{Binding AccountingEntries}" 
       SelectedItem="{Binding SelectedAccount}" 
       AutoGenerateColumns="False" 
       CanUserAddRows="False"  
       CanUserDeleteRows="False" 
       CanUserResizeColumns="False" 
       CanUserReorderColumns="False"     
       ScrollViewer.CanContentScroll="True" 
       ScrollViewer.VerticalScrollBarVisibility="Auto"     
       SelectionMode="Single" 
       x:Name="AccountEntryDataGrid"> 

     <DataGrid.InputBindings> 
      <MouseBinding Gesture="LeftDoubleClick" 
          Command="{Binding FieldClickedCommand}" 
          CommandParameter="{Binding ElementName=AccountEntryDataGrid, Path=SelectedItem}" /> 
     </DataGrid.InputBindings> 

     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding ID}" Header="No."/> 
      <DataGridTextColumn Binding="{Binding AccountName}" Header="Account Name"/> 
      <DataGridTextColumn Binding="{Binding Amount, StringFormat=0.00;;#}" 
           Header="Amount" 
           Width="90" /> 

      <DataGridTextColumn Binding="{Binding Debit, StringFormat=0.00;;#}" 
       Header="Debit" 
       Width="90" 
       CellStyle="{StaticResource TrialBalanceStyle}" 
       > 
      </DataGridTextColumn> 
      <DataGridTextColumn Binding="{Binding Credit, StringFormat=0.00;;#}" 
       Header="Credit" 
       Width="90" 
       CellStyle="{StaticResource TrialBalanceStyle}" 
       IsReadOnly="True"/>    
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

答えて

2

これを試してみてください。明らかに機能するはずです。

if(AccountEntryDataGrid.SelectedCells.Count == 1) 
{ 
    var selectedColumnHeader = 
     AccountEntryDataGrid.SelectedCells[0].Column.Header.ToString(); 
} 

おっと...申し訳ありませんが... はちょうど今あなたがMVVMを使用していることが分かりました。コマンドパラメータにSelectedCellsを渡します。 IList<DataGridCellInfo>タイプである必要があります。それに応じてMVVMのコードを変更します。このようなものかもしれない。

private void OnClicked(IList<DataGridCellInfo> selectedCells) 
{ 
    if(selectedCells.Count == 1) 
    { 
     var selectedColumnHeader = selectedCells[0].Column.Header.ToString(); 
    } 
} 

両方をお試しください。がんばろう。

+0

ありがとうございました! コードを使用すると、ビューでSelectionUnit = "Cell"をDataGridに設定し、選択したレコードを手動で更新するだけでした。 –

関連する問題