簡體   English   中英

C#-FrameworkElement.FindName返回null

[英]C# - FrameworkElement.FindName returns null

我花了一個小時來試圖解決這個問題。 我在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行時CheckBox在頭選中或取消選中。 這是我嘗試檢索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可視化器屏幕快照,在其中我可以清楚地看到我要查找的復選框:

WPF可視化工具FrameworkElement的屏幕快照

請告訴我我做錯了什么? 謝謝。

問題在於, 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;
    }
}

該行知道的范圍中不存在CheckBox。 它不是其模板的直接子代。

您需要使用靜態類VisualTreeHelper從該行向下鑽取以找到CheckBox類型的實例,並與其x:Name進行比較。

嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM