C# 在主窗口wpf mvvm c中从另一个页面更改页面

C# 在主窗口wpf mvvm c中从另一个页面更改页面,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我正在为wpf使用mvvmlight框架。 我有一个主窗口,我把我的框架放在第一个加载的位置。页面只是一个例子: <Frame Source="firstLoadedPage" /> 然后在单击firstLoadedPage中的按钮时更改_myFrameSourcePath的值。它不起作用,所以我尝试将MyFrameSourcePath更改为静态,然后更改MyFrameSourcePath的值,而不是页面中的_MyFrameSourcePath。它也不起作用 当我点

我正在为wpf使用mvvmlight框架。 我有一个主窗口,我把我的框架放在第一个加载的位置。页面只是一个例子:

        <Frame Source="firstLoadedPage" />
然后在单击firstLoadedPage中的按钮时更改_myFrameSourcePath的值。它不起作用,所以我尝试将MyFrameSourcePath更改为静态,然后更改MyFrameSourcePath的值,而不是页面中的_MyFrameSourcePath。它也不起作用


当我点击页面内的按钮将当前页面更改为另一个页面时,有人能告诉我如何更改主窗口中框架源中的页面吗?

您可以这样做。下面是一个Xaml示例

<Grid>
    <StackPanel Orientation="Vertical">
        <TextBlock>Outside area of frame</TextBlock>
        <Frame Name="FrameWithinGrid"  Source="{Binding FrameSource}">
        </Frame>
        <Button x:Name="button1" Height="23" Margin="114,12,25,0" Command="{Binding GoToCommand}"   
            VerticalAlignment="Top" >Navigate to Msdn
        </Button>
    </StackPanel>


</Grid>

就这些。确保视图模型实现INotifyPropertyChanged。如果您使用的是MVVM Light,请在写入时将DelegateCommand更改为RelayCommand

,是否缺少绑定?应该是这样的。另外,请确保设置的是public MyFrameSourcePath属性,该属性也将调用属性更改通知,而不是private\u MyFrameSourcePath。另一方面,我不确定这是否是同一件事,但我不久前写过关于使用MVVM导航的文章。。。也许这会帮助你朝着正确的方向前进?关键是这只是一个例子。我以前使用MainWindowViewModel中实现的属性绑定了Frame中的Souce。我想通过单击MyPage.xaml中的按钮来覆盖MainWindowViewModel中的此属性,这应该会更改我在源代码中的uri路径,但它甚至对静态变量也不起作用。我想做一些与您的答案类似的事情,NoahV,但在您的解决方案中,我正在使用此window.xaml中的按钮更改window.xaml中的页面。我想通过单击page.xaml中的按钮来更改页面。我的windowviewmodel中的属性URI应该更改什么。您应该为page.xml创建相应的视图模型,将按钮的命令设置为eg ExecuteCommand,在page.xml的视图模型中,如上所述声明ICommand
<Grid>
    <StackPanel Orientation="Vertical">
        <TextBlock>Outside area of frame</TextBlock>
        <Frame Name="FrameWithinGrid"  Source="{Binding FrameSource}">
        </Frame>
        <Button x:Name="button1" Height="23" Margin="114,12,25,0" Command="{Binding GoToCommand}"   
            VerticalAlignment="Top" >Navigate to Msdn
        </Button>
    </StackPanel>


</Grid>
      private Uri _frameSource = new Uri("http://www.google.com", UriKind.Absolute);
      public Uri FrameSource
      {
         get { return _frameSource;}

         set
         {
            _frameSource = value;
            OnPropertyChanged("FrameSource");
         }
      }

      public ICommand GoToCommand
      {
         get
         {
            return new DelegateCommand(ExecuteGoTo);
         }
      }

      private void ExecuteGoTo()
      {
         FrameSource = new Uri("http://www.msdn.com", UriKind.Absolute);
      }