我有三个页面,为了导航到每个页面,我将属性绑定到Frame的Source属性。如果我只是正常浏览页面,它工作得很好,但在调用GoBack方法后,Frame突然停止工作。如果我直接将URI设置为Source属性而不是使用绑定,它可以正常工作,我实际上是使用MVVM实现的,所以我不想直接设置Source属性。
- XAML -
<navigation:Frame x:Name="_frame" Source="{Binding CurrentPage}"/>
- 代码背后 -
Uri _currentPage;
public Uri CurrentPage
{
get { return _currentPage; }
set
{
_currentPage = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("CurrentPage"));
}
}
// back
private void Button_Click(object sender, RoutedEventArgs e)
{
if ( _frame.CanGoBack)
_frame.GoBack();
}
// test1
private void Button_Click_1(object sender, RoutedEventArgs e)
{
CurrentPage = new Uri("/TestPage1.xaml", UriKind.Relative);
}
// test2
private void Button_Click_2(object sender, RoutedEventArgs e)
{
CurrentPage = new Uri("/TestPage2.xaml", UriKind.Relative);
}
// test3
private void Button_Click_3(object sender, RoutedEventArgs e)
{
CurrentPage = new Uri("/TestPage3.xaml", UriKind.Relative);
}
有谁知道如何解决这个问题?我尝试了几种方法,但没有什么对我有用。
提前致谢,
柳
答案 0 :(得分:0)
经过一段时间的测试,我发现了它无法正常工作的原因。问题是由于某种原因调用GoBack后,对Source属性的绑定被删除。因此,如果您想这样做,请以编程方式再次设置绑定,如下所示。
_frame.SetBinding(Frame.SourceProperty, new Binding() { Source = this, Path = new PropertyPath("CurrentPage") });
但你应该考虑何时再次设置绑定,否则它无法正常工作。
柳
答案 1 :(得分:0)
我知道很久以前就问过这个问题了,而且已经有人自己回答了。我在寻找项目中完全相同问题的解决方案时遇到了这个问题。
我在GoBack()和GoForward()调用后尝试重新绑定 - 如果用户在地址栏中输入自己的路径,绑定也会中断。对我来说不幸的是它非常多。
我发现通过将Silverlight Frame上的Binding更改为Mode = TwoWay,它可以准确地解决问题并且从那时起就没有引起任何仇恨。
<sdk:Frame x:Name="ContentFrame"
Style="{StaticResource ContentFrameStyle}"
Source="{Binding CurrentPage, Source={StaticResource ViewModel}, Mode=TwoWay}"
Navigated="ContentFrame_Navigated"
NavigationFailed="ContentFrame_NavigationFailed"
Navigating="ContentFrame_Navigating">
我希望这也有助于其他一些穷人失去灵魂寻找解决同一问题的方法。