在主窗口中,我有一个Frame
,它有一个登陆页面的源,在框架的顶部是一个用户控件,其中包含一个TreeView
,{{1 }}导航到另一个页面。
当我单击每个节点时,我想更改TreeView
的来源。
如何基于Frame
节点将Source
的{{1}}更改为相应的Frame
?
这是我到目前为止尝试过的:
但是,仅当我将Page
放在每个TreeView
上时,此方法才有效;如果我将其放在主窗口的UserControl
上,则不起作用。当我尝试所需的方法时,我收到一条消息,提示“值未设置为对象的实例”
这是用户控件的XAML:
Page
这是用户控件的CS:
Frame
这是我的MainWindow的xaml:
<TreeView>
<TreeViewItem Header="applications"
Margin="0,10,0,0">
<TreeViewItem Name="newApplication"
Header="new applications"
MouseDoubleClick="NewApplication_MouseDoubleClick"></TreeViewItem>
<TreeViewItem Name="approvedApplication"
Header="approved applications"
MouseDoubleClick="ApprovedApplication_MouseDoubleClick"></TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="repair requests">
<TreeViewItem Header="tester"></TreeViewItem>
</TreeViewItem>
</TreeView>
我想将用户控件放在private void NewApplication_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
Uri uri = new Uri("/Views/oem_newApplications.xaml", UriKind.Relative);
NavigationService ns = NavigationService.GetNavigationService(this);
ns.Navigate(uri);
}
上,并使用<Grid>
<Frame x:Name="mainFrame" Source="/Views/oem_main.xaml"/>
<local:menuTree HorizontalAlignment="Left" Height="584" Margin="0,135,0,0" VerticalAlignment="Top" Width="160"/>
</Grid>
来更改Frame
。
答案 0 :(得分:0)
您可以将TreeView.SelectedItem
直接绑定到Frame.Source
。此解决方案使用FrameworkElement.Tag
属性存储Page
URI。要使绑定生效,您需要将TreeView.SelectedItem
的{{1}}强制转换为object
。
或者,您可以引入一个附加属性来保存TreeViewItem
URI。
如果Page
是TreeView
的一部分并且不能直接访问,则应通过专用属性(例如UserControl
)公开TreeView.SelectedItem
,然后绑定{ {1}}:
MenuTree.xaml.cs
SelectedPage
MenuTree.xaml
Frame.Source
MainWindow.xaml
public partial class MenuTree : UserControl
{
public static readonly DependencyProperty SelectedPageProperty = DependencyProperty.Register(
"SelectedPage",
typeof(string),
typeof(MenuTree),
new PropertyMetadata("/landingPage.xaml"));
public string SelectedPage
{
get { return (string) GetValue(MenuTree.SelectedPageProperty); }
set { SetValue(MenuTree.SelectedPageProperty, value); }
}
public MenuTree()
{
InitializeComponent();
}
private void OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
this.SelectedPage = (e.NewValue as FrameworkElement)?.Tag as string;
}
}
ExamplePage.xaml
<UserControl>
<TreeView x:Name="IndexTreeView" SelectedItemChanged="OnSelectedItemChanged" >
<TreeViewItem Header="applications">
<TreeViewItem Header="approved applications"
Tag="/ExamplePage.xaml" />
</TreeViewItem>
</TreeView>
</UserControl>