c# - WPF MVVM-DataGrid单元格单击,获取列标题

标签 c# wpf mvvm datagrid

使用Prism框架实现WPF MVVM解决方案。

我想使用DataGrid或GridView显示表格数据。
然后,在单元格中单击时,它应触发一个Command并作为ColumnHeader的标题作为CommandParameter。
(仅对于下面的代码中显示的“借方和贷方”列。该代码最终将执行的操作是单击“借方”字段时,“金额”将复制到该字段。如果随后单击“贷方”字段,则将清除“借方”字段并将值复制到“信用”字段中)

尝试使用DataGrid,并且仅设法将所选记录传递回ViewModel。
使用GridView,仅设法将命令附加到GridViewColumn header 。

任何帮助将不胜感激。

此刻,我的代码如下所示:

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>

最佳答案

试试这个。它显然应该工作。

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();
    }
}

尝试两种方式。祝你好运。

关于c# - WPF MVVM-DataGrid单元格单击,获取列标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38410585/

相关文章:

wpf - 在 ViewModel 中捕获 CollectiveViewSource 的 Filter 事件

WPF/MVVM - 绑定(bind)子控件集合

wpf - 以编程方式突出显示 MenuItem.Items

c# - 与在 Visual Studio 中运行相比,WPF exe 运行速度非常慢

c# - 在 C# 中选择禁用文本框中的文本

c# - 从 "WindowsAzure.Storage"迁移时,我应该为 Azure 表使用什么包

wpf - Idataerrorinfo 中如何调用索引器?

wpf DelegateCommand 和 ValidationRules

c# - 即使使用 @import 也捆绑 css

c# - 在 C# 中使用 List<T> 时,对象引用未设置为对象的实例