wpf 在通用Windows应用程序上使用ViewModel(MVVM)绑定页面

6psbrbz9  于 2023-04-22  发布在  Windows
关注(0)|答案(2)|浏览(174)

我需要在Xaml wpf页面中绑定Frame控件上的页面。我的xaml页面:

<Page
x:Class="MyPro.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyPro"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:viewmodel="using:MyPro.ViewModel"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:x1="using:System"
mc:Ignorable="d">
<Page.DataContext>
    <viewmodel:PagerViewModel x:Name="PagerViewModel"></viewmodel:PagerViewModel>
</Page.DataContext>
<Frame 
       VerticalContentAlignment="Stretch"
       HorizontalContentAlignment="Stretch"
       Name="frameMainPage"
       DataContext="{Binding Source=Pager.Page, Mode=TwoWay}">        
</Frame>

我试过这样做(但我不知道是否正确):
DataContext="{Binding Source=Pager.Page,Mode=TwoWay}”
但不起作用
我的视图模型,我调用Pager来设置新的Page:

class PagerViewModel
{
    public PagerViewModel()
    {
        m_pager = new Pager();
    }

    public static Pager m_pager;  
    public Pager Pager
    {
        get
        {
            return m_pager;
        }
        set
        {
            m_pager = value;
        }
    }
}

在我的模型中,我这样设置页面模式:

public class Pager : INotifyPropertyChanged
{
    private Page m_page;
    public Page Page
    {
        get
        {
            return m_page;
        }
        set
        {
            m_page = value;
            OnPropertyChanged("Page");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}

我需要从代码中的每个部分更改页面如下所示:

PagerViewModel.m_pager.Page = new MyPage();

如何在通用Windows应用程序UWP上执行此操作?

4dbbbstv

4dbbbstv1#

我是这样解决的:

DataContext="{Binding Path=Pager.Page, Mode=TwoWay}"

您必须在UWP上的通用应用程序中使用路径而不是源

ergxz8rk

ergxz8rk2#

绑定到FrameDataContext并不做任何事情。DataContext基本上只是告诉控件它的绑定的相对路径引用了什么,但不会导致任何行为(或者至少这对内置控件是有效的)。
在你的例子中,你需要绑定到Frame控件的Content属性:

<Frame Content="{Binding Pager.Page}" />

这对我来说确实有效,我已经用你的代码和主页上的一个额外按钮在一个空白解决方案上测试了它:

XAML

<Page
    x:Class="App4.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App4"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Page.DataContext>
        <local:PagerViewModel x:Name="PagerViewModel"></local:PagerViewModel>
    </Page.DataContext>
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Frame Width="500" Height="500" Content="{Binding Pager.Page}" />
        <Button Click="ButtonBase_OnClick">Click</Button>
    </Grid>
</Page>

代码隐藏

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        ((PagerViewModel)DataContext).Pager.Page = new SecondPage();
    }
}

SecondPage是一个空页面,我将其设置为蓝色背景,以便能够清楚地看到它显示在Frame中。

相关问题