【问题标题】:C# - FrameworkElement.FindName returns nullC# - FrameworkElement.FindName 返回 null
【发布时间】:2017-06-05 11:57:48
【问题描述】:

我花了过去一小时试图弄清楚这一点。我在DataGrid 中有一个CheckBox,如下所示:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.Header>
        <CheckBox Name="chkall" Content="Select All" Checked="chkall_Checked" Unchecked="chkall_Unchecked"/>
    </DataGridTemplateColumn.Header>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox Tag="{Binding Path=id}" x:Name="chksingle"  Checked="chksingle_Checked" Unchecked="chksingle_Unchecked"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

如您所见,当标题中的 CheckBox 被选中或未选中时,我正在尝试检查和取消选中 DataGrid 行内的 CheckBoxes。这是我试图检索 CheckBox 并将其标记为已选中的代码:

private void chkall_Checked(object sender, RoutedEventArgs e)
{
    foreach (var r in userDG.Items)
    {
        DataGridRow row =(DataGridRow)userDG.ItemContainerGenerator.ContainerFromItem(r);
        FrameworkElement FW_element = userDG.Columns[0].GetCellContent(row);
        FW_element.ApplyTemplate();
        var checkbox = FW_element.FindName("chksingle") as CheckBox;
        checkbox.IsChecked = false;
    }
}

我已经尝试过RegisterName() 方法,我也尝试过VisualTreeHelper,但没有任何效果。

这一行总是返回null:

var checkbox = FW_element.FindName("chksingle") as CheckBox;

这是我的FrameworkElementWPF 可视化工具屏幕截图,我可以清楚地看到我要查找的复选框:

请告诉我我做错了什么?谢谢。

【问题讨论】:

    标签: c# wpf datagrid datatemplate


    【解决方案1】:

    问题是DataTemplate 是名称范围边界,即模板化元素(在本例中为ContentPresenter)或其任何祖先都不知道模板内定义的命名元素。为了在模板中找到命名元素,您需要改用DataTemplate.FindName 方法(继承自FrameworkTemplate)。请注意,它需要两个参数而不是一个,第二个是模板元素。这应该可以为您解决问题:

    private void chkall_Checked(object sender, RoutedEventArgs e)
    {
        foreach (var r in userDG.Items)
        {
            DataGridRow row = (DataGridRow)userDG.ItemContainerGenerator.ContainerFromItem(r);
            FrameworkElement FW_element = userDG.Columns[0].GetCellContent(row);
            //We use the CellTemplate defined on the column to find the CheckBox
            var checkbox = ((DataGridTemplateColumn)userDG.Columns[0]).CellTemplate.FindName("chksingle", FW_element) as CheckBox;
            checkbox.IsChecked = true;
        }
    }
    

    【讨论】:

      【解决方案2】:

      CheckBox 不存在于 Row 知道的范围内。它不是其模板的直接子代。

      您需要使用静态类 VisualTreeHelper 从行中向下钻取以找到 CheckBox 类型的实例,并与它的 x:Name 进行比较。

      【讨论】:

        【解决方案3】:

        试试这个:

        FrameworkElement FW_element = userDG.Columns[0].GetCellContent(row);
        CheckBox checkbox = VisualTreeHelper.GetChild(FW_element, 0) as CheckBox;
        

        【讨论】:

          猜你喜欢
          • 2023-03-07
          • 1970-01-01
          • 2014-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多