2016-07-16 2 views
1

Использование инфраструктуры Prism для реализации решения MVVM WPF.WPF MVVM - ячейка DataGrid Щелкните, получите заголовок столбца

Я хочу отображать табличные данные, используя DataGrid или GridView. Затем, щелкая в ячейке, он должен скрыть команду и как CommandParameter, подпись ColumnHeader. (Только для дебетов & Кредитные столбцы, как показано в приведенном ниже коде. То, что в конечном итоге сделает код, - это щелчок в поле «Дебет», сумма будет скопирована в это поле. Если после этого нажать в поле «Кредит», поле «Дебет» будет очищено и значение, скопированное в поле «Кредит»)

Пробовал 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 и вручную обновить выбранную запись. –

Смежные вопросы