从弹出窗口中查找并刷新树视图

时间:2014-01-14 14:12:54

标签: c# wpf treeview find element

我遇到了问题。我在我的WPF项目中使用TreeView来可视化我的XML数据。 TreeView位于UserControl中并链接到主网格。问题是,当我在弹出窗口中编辑我的XML数据时,我无法找到treeView(按名称元素)来刷新它。

请帮帮我。

谢谢

WPF MainWindow:

...
 ...
<Grid>
<uc:UserControlTreeView/>
</Grid>
...
...

用户控件:

<UserControl x:Class="UserControlTreeView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    >
    <UserControl.Resources>
        <XmlDataProvider x:Key="MyList" x:Name="MyList" Source="d:/a/library.xml" XPath="Libraries/*"/>


        <HierarchicalDataTemplate DataType="Library" ItemsSource="{Binding XPath=*}">
            <TextBlock Text="{Binding XPath=@Name}"></TextBlock>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate DataType="Batch" ItemsSource="{Binding XPath=*}">
            <TextBlock Text="{Binding XPath=@Name}"></TextBlock>
        </HierarchicalDataTemplate>
    </UserControl.Resources>

    <TreeView  x:Name="libraryTree"  VerticalAlignment="Top" AllowDrop="True" TreeViewItem.Expanded="TreeViewItem_Expanded" ItemsSource="{Binding Source={StaticResource MyList}}">
        <TreeView.Resources>
            <ContextMenu x:Key="TestMenu">
            </ContextMenu>
        </TreeView.Resources>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="False"/>
                <EventSetter Event="PreviewMouseRightButtonDown" Handler="OnPreviewMouseRightButtonDown" />
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>
</UserControl>

和pupup窗口的代码:

XmlElement root = docx.DocumentElement;         XmlNode element = root.SelectSingleNode(“/ Libraries / Library [@ Name ='Pics']”);

    XmlElement child = docx.CreateElement("Batch");

    child.SetAttribute("Name", System.IO.Path.GetFileName(fname));
    child.SetAttribute("Type", "Batch");
    child.SetAttribute("Path", fname);

    element.AppendChild(child);
    docx.Save("d:/a/library.xml");

    TreeView tr = (TreeView)Application.Current.MainWindow.FindName("libraryTree");
    //TreeView tr = (TreeView)this.Owner.FindName("libraryTree");
    tr.Items.Refresh();
    tr.UpdateLayout();

但是tr仍然是空的:(

1 个答案:

答案 0 :(得分:0)

不幸的是,您无法使用弹出窗口向上或向下移动视觉树,因为弹出窗口不是可视树的一部分。与DataBinding相同,弹出窗口不会继承树中的绑定。

我使用Josh Smith's DataContextSpy类/示例来实例化弹出窗口所需的部分绑定,并将其作为StaticResource分配给弹出窗口。然后在弹出窗口中直接操作DataContext,它间接操作应用程序的其他peices(在您的情况下 - 可视树)。

或者您可以选择将控件的某些部分公开为公共属性方法,并允许它们之间更紧密的耦合。