【问题标题】:How to get DataGrid from DataGridCell or from TextBox inside template如何从 DataGridCell 或模板内的 TextBox 获取 DataGrid
【发布时间】:2015-09-29 13:55:35
【问题描述】:

我有一个 DataGrid(ProductsDataGrid),这个 DataGrid 有一个 RowDetailTemplate。此 RowDetailTemplate 具有另一个 DataGrid,而这第二个 DataGrid 在其列中具有一个 DataTemplate。我想从 TextBox 的 LostFocus 事件中获取第二个 DataGrid(WarehouseDataGrid)。

        <sdk:DataGrid x:Name="ProductsDataGrid">
                    <sdk:DataGrid.Columns>
                        <sdk:DataGridTextColumn Header="Product Name" />
                        <sdk:DataGridTextColumn Header="Quantity" />
                        <sdk:DataGridTextColumn Header="Value" />
                    </sdk:DataGrid.Columns>
                    <sdk:DataGrid.RowDetailsTemplate>
                        <DataTemplate>
                            <sdk:DataGrid x:Name="WarehouseDataGrid">
                                <sdk:DataGrid.Columns>
                                    <sdk:DataGridTemplateColumn Header="Warehouse" />
                                    <sdk:DataGridTemplateColumn Header="Quantity">
                                        <sdk:DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <TextBox x:Name="txtQuantity" LostFocus="txtQuantity_LostFocus" />
                                            </DataTemplate>
                                        </sdk:DataGridTemplateColumn.CellTemplate>
                                    </sdk:DataGridTemplateColumn>
                                </sdk:DataGrid.Columns>
                            </sdk:DataGrid>
                        </DataTemplate>
                    </sdk:DataGrid.RowDetailsTemplate>
                </sdk:DataGrid>

我试过了

 private void txtQuantity_LostFocus(object sender, RoutedEventArgs e)
 {
      TextBox txt = sender as TextBox;
      var a = txt.Parent; // returns DataGridCell
 }

我想获取 DataGrid(WarehouseDataGrid),但我只获取 DataGridCell。我也试过 DataGridCell.Parent 但不是 DataGrid。

【问题讨论】:

  • 为什么不尝试向上遍历树呢?重点穿越祖先:stackoverflow.com/questions/4428130/…
  • @SOReader 成功了。我曾尝试使用一些树助手,但我没有注意到它们是后代,在本例中是祖先。
  • 很高兴听到这个消息 ;)

标签: c# wpf silverlight datagrid


【解决方案1】:
private void txtQuantity_LostFocus(object sender, RoutedEventArgs e)
{
    var warehouseDataGrid = ((TextBox)sender).GetAncestor<DataGrid>();
    ... // do stuff
}

GetAncestor 是一种扩展方法

public static class ControlExtensions
{
    public static TAncestor GetAncestor<TAncestor>( this DependencyObject subElement )
        where TAncestor : DependencyObject
    {
        return subElement.GetAncestor<TAncestor>( potentialAncestorToStopTheSearch: null );
    }

    public static TAncestor GetAncestor<TAncestor>( this DependencyObject subElement, UIElement potentialAncestorToStopTheSearch )
        where TAncestor : DependencyObject
    {
        DependencyObject parent;
        for (DependencyObject subControl = subElement; subControl != null; subControl = parent)
        {
            if (subControl is TAncestor) return (TAncestor) subControl;

            if (object.ReferenceEquals( subControl, potentialAncestorToStopTheSearch )) return null;


            parent = VisualTreeHelper.GetParent( subControl );
            if (parent == null)
            {
                FrameworkElement element = subControl as FrameworkElement;
                if (element != null)
                {
                    parent = element.Parent;
                }
            }
        }
        return null;
    }
}

【讨论】:

  • 感谢您的回答。在您回答之前,我按照@SOReader 的建议使用stackoverflow.com/questions/4428130 中的答案解决了我的问题,这基本上就是您的答案。
猜你喜欢
  • 2010-09-18
  • 2011-03-30
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
相关资源
最近更新 更多