从DataGridCell获取控件

12
假设我有一个任意控件在DataGridTemplateColumn中,我想知道如何获取该控件,假设我已经检索到包含该控件的DataGridCell。
包含DataGrid的XAML文件如下:
    <DataGrid Name="dgMovement">
...    
    <DataGridTemplateColumn Header="Target %">
       <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
            <vi:PercentageEditor Value="{Binding TargetPercentage, Mode=TwoWay,
                      UpdateSourceTrigger=PropertyChanged}" Width="100px"  
                      cal:Message.Attach="[Event PreviewLostKeyboardFocus] = [Action ChangeTargetPercentage];[Event PreviewGotKeyboardFocus] = [Action OnFocus]" 
                      Name="aa" />
          </DataTemplate>
       </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>...

我使用以下扩展方法检索了DataGridCell:

DataGridCell cell = view.dgMovement2.GetCell(index, 6);

这个静态类中的扩展方法可以在这里找到。

问题是,一旦我得到了DataGridCell,如何检索“PercentageEditor”?有人可以帮我吗?任何帮助将不胜感激。谢谢!

2个回答

16

您可以使用控件的名称在模板中查找它,例如:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <uc:Bogus x:Name="root" ItemsSource="{Binding Machines}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

var cell = dataGrid.GetCell(5, 0);
var cp = (ContentPresenter)cell.Content;
var bogus = (Bogus)cp.ContentTemplate.FindName("root", cp);

请注意,通常情况下这是不必要的,因为修改模板控件大部分可以使用数据绑定、附加属性和事件来完成。一般来说,我会限制通过代码访问模板的方式只适用于自定义控件(这些控件通常有指定部分)。

很高兴能帮到您 :) (您可以通过点击左侧的勾选标记接受此答案) - H.B.
1
几年后我仍然觉得这很有用。谢谢。 - Ran Sagy

-1

这对我有用(C#)

        DataGridRow row = (DataGridRow)dgContacts.ItemContainerGenerator.ContainerFromItem(item);
            var cell = dgContacts.Columns[0];

            var cp = (ContentPresenter)cell.GetCellContent(row);
            CheckBox rowSelected = (CheckBox)cp.ContentTemplate.FindName("Edit", cp);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接