在DataGridComboBoxColumn中编辑单元格时如何获取“当前单元格”值?

时间:2019-04-24 07:34:45

标签: c# .net wpf

我是WPF的新手,试图修复一个自动建议的DataGridComboBoxColumn

<DataGridComboBoxColumn x:Name="list_itemname" Width="*" Header="Item Name"  >
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="IsEditable" Value="True"/>
            <Setter Property="ItemsSource" Value="{Binding Path=itemlist}" />
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

3 个答案:

答案 0 :(得分:2)

您必须捕获与更改单元格有关的事件:CellEditEnding。首先,您必须声明处理事件的方法:

void cellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    var editedComboBoxColumn = e.EditingElement as ComboBox;
}

,然后将处理程序与您的网格挂钩:

<DataGrid x:Name="grid" CellEditEnding="cellEditEnding" />

答案 1 :(得分:1)

我建议您使用datagrid模板列,而不要使用datagrid组合框列。

大约

    <DataGridTemplateColumn>
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox IsEditable="True" 
                          Text="{Binding PropertyInRow}" 
                          ItemsSource="{Binding itemlist}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>

此处PropertyInRow是行视图模型中propprop的名称。无论您的数据网格的任何项目来源都必然是一个可观察的集合。

如果您想在文本更改时执行某些操作,则可以将代码放入该属性的设置器中。

这是mvvm模式,如果计划进行任何认真的wpf开发,则应该从一开始就学习这一点。当然,如果您打算在商业wpf团队中工作,因为他们都使用mvvm。

也。

如果itemlist在rowviewmodel中不是属性,而是在窗口viewmodel中的某个位置,则需要在该绑定上有一些相对源。

答案 2 :(得分:0)

如果您的ItemSource是ListCollectView,则可以这样获取当前项目:

public void OnCellValueChanged(object sender, CellValueChangedEventArgs e)
{
    var currentItem = itemlist.CurrentItem; // to get the whole current item

    // Or you just get the current changed cell value from the EventArgs:
    var currentValue = e.Value?.ToString();
}