在 Xamarin Forms Xaml MasterDetailPage 上共享上下文

Share Context on Xamarin Forms Xaml MasterDetailPage

我设法在 Xamarin Forms Xaml 上制作了一个 MasterDetail 页面,它工作正常。 我的 MasterDetailPage 代码是:

<?xml version="1.0" encoding="utf-8" ?>
<MasterDetailPage  xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm="clr-namespace:XXX.ViewModel"
             xmlns:conv="clr-namespace:XXX.Converters"
             xmlns:local="clr-namespace:XXX;assembly=XXX"
             x:Class="XXX.MainPage"
             Title="XXX">
  <MasterDetailPage.Master>
    <local:MainMenu />
  </MasterDetailPage.Master>
  <MasterDetailPage.Detail>
    <ContentPage BindingContext="{StaticResource viewModel}" Title="XXX">
      //old MainPage Content
   </ContentPage>
 </MasterDetailPage.Detail>

该应用程序与 ViewModel 一起工作,它像旧的 MainPage 一样启动,如果我从左侧摆动它会显示细节。

问题来了,因为我做了所有的更改来为详细内容中的列表视图做一个过滤器菜单,我需要共享详细信息和主视图之间的上下文,以便当用户在Master中按下一个按钮,Detail中的列表内容发生变化

我还需要知道如何以编程方式open/close MasterPage。

好的,我在这里找到了gaogang-athena Github

只需要从 ContentPages 中删除 BindingContext 并添加:

<MasterDetailPage.BindingContext>
    <vm:MainViewModel />
  </MasterDetailPage.BindingContext>

为了关闭或打开它,我使用了 IsPresented,所以最后我的代码如下所示:

  <?xml version="1.0" encoding="utf-8" ?>
  <MasterDetailPage  xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm="clr-namespace:XXX.ViewModel"
             xmlns:conv="clr-namespace:XXX.Converters"
             xmlns:local="clr-namespace:XXX;assembly=XXX"
             x:Class="XXX.MainPage"
             IsPresented="{Binding MasterIsPresented}"
             Title="XXX">
  <MasterDetailPage.BindingContext>
    <vm:MainViewModel />
  </MasterDetailPage.BindingContext>

  <MasterDetailPage.Master >
    <local:MainMenu/>
  </MasterDetailPage.Master>
  <MasterDetailPage.Detail>
    <ContentPage  Title="XXX">
  ...

如果你想打开/关闭 MasterPage 使用这个:

public partial class MainPage : MasterDetailPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        void OnButtonClick(object sender, EventArgs e)
        {
            // hide master page
            this.IsPresented = false;
            // show master page
            this.IsPresented = true;
        }
    }