0

在 HierarchicalDataTemplate 中,我得到了 2 textblocks,我想从两者中复制文本。在复选框单击/检查期间,它会将文本更新为列表。

该功能正在从一个文本块中获取文本。

如何从两个文本块中获取文本并将其更新到列表中?

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 获取文本功能:

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 分层数据模板:

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

1 回答 1

1

我目前无法对此进行测试,但我认为它应该可以工作:

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);           
    }       
}

让我知道事情的后续。


更新>>>

好的,所以我不确定这是否可行……看起来它仍然应该可行,但我会接受你说它不可行。因此,我能想到的唯一其他方法可以让您访问那一秒TextBlock是给它一个名称并使用该FindName方法。

我不会在这里复制所有内容,而是将您指向 MSDN 上的How to: Find DataTemplate-Generated Elements页面,该页面具有详细的代码示例和解释。基本上,您需要ContentPresenter从相关中获取TreeViewItem,然后您可以DataTemplateContentPresenter. 最后DataTemplate,您可以TextBlock像这样访问:

首先更改您的 XAML:

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

然后抓住ContentPresenter并像这样使用它:

TextBlock secondTextBlock = dataTemplate.
    FindName("SecondTextBlock", contentPresenter) as TextBlock;
if (secondTextBlock != null) selectedNames.Add(secondTextBlock.Text );
于 2013-11-13T15:49:12.380 回答