WPF:选择另一个单元格时更新数据网格中的单元格

时间:2016-12-28 18:15:01

标签: wpf datagrid

我们有一个由DataGridTemplateColumns组成的DataGrid 一些列包含简单的TextBlocks,而其他列使用ComboBoxes。

当用户点击带有ComboBox的单元格时,我们需要使用单击的ComboBox的当前值更新同一行中的TextBlock。 当组合框选择的值发生变化时,这很容易做到(当组合框的值发生变化时,绑定到组合框的属性会更新绑定到texblock的属性),但我无法弄清楚如何进行此操作当仅选择组合框细胞时 datagrid上的SelectionUnit是CellOrRowHeader。

我一直在努力尝试从SelectedCellsChangedEvent处理程序等中提取DataGrid.CurrentCell中的值,但没有成功。
为什么在选择数据网格单元格时获取当前值如此困难?!
任何指针都将不胜感激......

1 个答案:

答案 0 :(得分:0)

不确定哪里出了问题,但这对我有用。 MyRowItem只是一个实现INotifyPropertyChanged的随机类。

它需要一些额外的布线来往返值,这可能会变得奇怪。

private void DataGrid_SelectedCellsChanged(object sender, 
    SelectedCellsChangedEventArgs e)
{
    //  For multiselection, e.AddedCells is a collection of all 
    //  currently selected cells as DataGridCellInfo

    var currentCell = (sender as DataGrid).CurrentCell;

    var row = currentCell.Item as MyRowItem;

    //  Note that we're using the column header as a magic string.
    //  We could use the Tag property to make this slightly less 
    //  fragile. 
    switch (currentCell.Column.Header.ToString())
    {
        case "Combo One":
            row.TextCol = row.ComboColOne;
            break;

        case "Combo Two":
            row.TextCol = row.ComboColTwo;
            break;
    }
}

XAML

<DataGrid 
    ItemsSource="{Binding Path=ItemCollection}" 
    SelectionUnit="CellOrRowHeader"
    AutoGenerateColumns="False" 
    SelectedCellsChanged="DataGrid_SelectedCellsChanged"
    >
    <DataGrid.Columns>
        <DataGridTextColumn 
            Header="Text" 
            Binding="{Binding TextCol}" 
            Width="120"
            />
        <DataGridComboBoxColumn
            Header="Combo One"
            ItemsSource="{Binding Source={x:Static local:MyRowItem.BValues}}"
            SelectedItemBinding="{Binding ComboColOne}"
            Width="120"
            />
        <DataGridComboBoxColumn
            Header="Combo Two"
            ItemsSource="{Binding Source={x:Static local:MyRowItem.CValues}}"
            SelectedItemBinding="{Binding ComboColTwo}"
            Width="120"
            />
    </DataGrid.Columns>
</DataGrid>