0

HierarchicalDataTemplate で 2textblocksを取得し、両方からテキストをコピーしたいと考えています。チェックボックスのクリック/チェック中に、テキストがリストに更新されます。

関数は、1 つのテキストブロックからテキストを取得しています。

両方のテキストブロックからテキストを取得してリストに更新するにはどうすればよいですか?

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 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>
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の DataTemplate で生成された要素の検索方法に関するページを紹介します。基本的にContentPresenter、関連する からを取得する必要があります。その後、から にTreeViewItemアクセスできます。最後に を使用すると、次のように にアクセスできます。DataTemplateContentPresenterDataTemplateTextBlock

最初に 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 に答える