![](/img/trans.png)
[英]Why the FrameworkElement.FindName(string) method returns null in my case?
[英]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;
這是我的FrameworkElement
的WPF可視化器屏幕快照,在其中我可以清楚地看到我要查找的復選框:
請告訴我我做錯了什么? 謝謝。
問題在於, 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.