Найти и обновить дерево в всплывающем окне
У меня проблема. Я использую TreeView в своем проекте WPF для визуализации моих данных XML. TreeView находится в UserControl и связан с основной сеткой. Проблема в том, что когда я редактирую свои данные XML во всплывающем окне, я не могу найти treeView (элемент по имени), чтобы обновить его.
Пожалуйста, помогите мне.
Спасибо
WPF MainWindow:
...
...
<Grid>
<uc:UserControlTreeView/>
</Grid>
...
...
UserControl:
<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>
и код окна куклы:
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 ответ
К сожалению, вы не можете перемещаться вверх или вниз по визуальному дереву, используя всплывающее окно, потому что всплывающие окна не являются частью визуального дерева. То же самое касается DataBinding, всплывающее окно не будет наследовать привязку от дерева.
я использовал Josh Smith's DataContextSpy
класс / пример для создания экземпляров частей привязок, необходимых для всплывающего окна, и назначения его всплывающему окну как StaticResource
, Затем во всплывающем окне вы напрямую манипулируете объектом DataContext, который косвенно манипулирует другими компонентами приложения (в вашем случае - визуальным деревом).
Или вы можете выставить части ваших элементов управления в качестве методов открытых свойств и обеспечить более тесную связь между ними.