Question

In the HierarchicalDataTemplate, i got 2 textblocksand I want to copy the texts from the both. During the check-box click/check it'll update the text to a list.

The function is getting the text from one textblock.

How can i get text from both textblocks and update it to the list?

private List<string> selectedNames = new List<string>();
private void TreeView_Checked(object sender, RoutedEventArgs e)
{
    CheckBox chkBox = sender as CheckBox;
    StackPanel stackPanel = chkBox.Parent as StackPanel;
    TextBlock txtBlock = FindVisualChild<TextBlock>(stackPanel);

    bool isChecked = chkBox.IsChecked.HasValue ? chkBox.IsChecked.Value : false;

    if (isChecked)
    {
        selectedNames.Add(txtBlock.Text );             
    }

}

CheckBox get text function:

private static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is T)
            return (T)child;
        else
        {
            T childOfChild = FindVisualChild<T>(child);
            if (childOfChild != null)
                return childOfChild;
        }
    }
    return null;
}

WPF HierarchicalDataTemplate:

<StackPanel Orientation="Horizontal" >
<CheckBox Name="checkBoxTree"  Checked="TreeView_Checked" Unchecked="checkBoxTree_Unchecked" 
          Margin="0,4,0,0"  Style="{DynamicResource CheckBoxStyle1}"/>

<TextBlock Text="{Binding XPath=@Name, Mode=TwoWay}" />

<TextBlock >                               
           <Hyperlink NavigateUri="{Binding XPath=@WebSite}" RequestNavigate="Hyperlink_RequestNavigate">  
               <TextBlock Text="{Binding XPath=@WebSite}" /> 
           </Hyperlink>    
</TextBlock>
</StackPanel>
Was it helpful?

Solution

I can't test this at the moment, but I think that it should work:

private void TreeView_Checked(object sender, RoutedEventArgs e)
{
    CheckBox chkBox = sender as CheckBox;
    StackPanel stackPanel = chkBox.Parent as StackPanel;
    TextBlock txtBlock = FindVisualChild<TextBlock>(stackPanel);
    Hyperlink hyperlink = FindVisualChild<Hyperlink>(stackPanel);
    TextBlock secondTextBlock = FindVisualChild<TextBlock>(hyperlink);

    bool isChecked = chkBox.IsChecked.HasValue ? chkBox.IsChecked.Value : false;

    if (isChecked)
    {  
        selectedNames.Add(txtBlock.Text);   
        selectedNames.Add(secondTextBlock.Text);           
    }       
}

Let me know how it goes.


UPDATE >>>

Ok, so I wasn't sure whether that would work or not... it still looks like it should work, but I'll accept that you say it doesn't. So the only other way that I can think of you gaining access to that second TextBlock would be to give it a name and use the FindName method.

Rather than duplicate everything here, I'll point you towards the How to: Find DataTemplate-Generated Elements page on MSDN which features a detailed code example and explanation. In basic, you need to get the ContentPresenter from the relevant TreeViewItem and then you can access the DataTemplate from the ContentPresenter. Finally with the DataTemplate, you can access the TextBlock like this:

First change your XAML:

<Hyperlink NavigateUri="{Binding XPath=@WebSite}" 
    RequestNavigate="Hyperlink_RequestNavigate">  
    <TextBlock Name="SecondTextBlock" Text="{Binding XPath=@WebSite}" /> 
</Hyperlink>

Then get hold of the ContentPresenter and use it like this:

TextBlock secondTextBlock = dataTemplate.
    FindName("SecondTextBlock", contentPresenter) as TextBlock;
if (secondTextBlock != null) selectedNames.Add(secondTextBlock.Text );
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top