从DataGridTemplateColumn中的自定义控件获取价值

时间:2018-12-20 19:22:04

标签: c# wpf

我正在修改使用Grid_CellEditEnding的旧代码-我修改了网格以使用自定义控件:

  <DataGridTemplateColumn x:Name="cellQty" Header="Qty" Width="1.1*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Resources:NumericTextColumn  Text="{Binding Qty}"  >
                                </Resources:NumericTextColumn>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                        <DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <Resources:NumericTextColumn  Text="{Binding Qty}"  >
                                </Resources:NumericTextColumn>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
                    </DataGridTemplateColumn>

一旦单元事件触发,我就试图获取对象的值,但是很难转换对象(获取表示框架错误)

 private void Grid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
                if(e.Column.Header.ToString().Equals("Qty"))
                { 
                   //this is in error             
                 var newQuantityText = ((NumericTextColumn)e.EditingElement).Text; 
                }

        }

1 个答案:

答案 0 :(得分:1)

我使用了该行的DataContext属性,并使用Class Type进行了强制转换以获得Property。代替数据类,您需要提供具有数量属性的类。

 private void Grid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
            if(e.Column.Header.ToString().Equals("Qty"))
            { 
                 var d = ((Data)e.Row.DataContext).Qty;
            }
    }

更新的答案

为了获得当前输入的数据,请在网格行中。

private void Grid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
            if(e.Column.Header.ToString().Equals("Qty"))
            { 
                 var NumericDataCtrl= GetVisualChild<NumericTextColumn>(e.EditingElement);
                    var data  = NumericDataCtrl.Text;
            }
    }

要访问EditingElement内部的子控件,我使用了以下方法

public static T GetVisualChild<T>(Visual parent) where T : Visual

    {

        T child = default(T);

        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);

        for (int i = 0; i < numVisuals; i++)

        {

            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);

            child = v as T;

            if (child == null)

            {

                child = GetVisualChild<T>

                (v);

            }

            if (child != null)

            {

                break;

            }

        }

        return child;

    }