2017-06-05 68 views
0

我花了一個小時試圖弄清楚這一點。我有一個CheckBoxDataGrid如下:C# - FrameworkElement.FindName返回null

<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> 

正如你可以看到我試圖檢查,並取消內DataGridCheckBox上課時,在標題中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; 

這裏是一個WPF可視化截圖我FrameworkElement,我可以清楚地看到,我試圖找到複選框:

WPF visualizer screenshot of FrameworkElement

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

回答

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; 
    } 
} 
+0

謝謝你做的伎倆! –

0

行知道範圍內不存在CheckBox。它不是它的模板的直接孩子。

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

0

試試這個:

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