(Xamarin MasterPageDetail ListView SelectedItem with MVVM)如何在单击时正确加载菜单页?

(Xamarin MasterPageDetail ListView SelectedItem with MVVM)如何在单击时正确加载菜单页?,listview,mvvm,xamarin.forms,master-detail,selecteditem,Listview,Mvvm,Xamarin.forms,Master Detail,Selecteditem,我不知道如何将listview中的选定菜单项正确绑定到视图模型中与其关联的load page事件 我现在的方式很有效。但是,问题是,当从左侧滑动菜单时,菜单页面保持选中状态,仍然突出显示为橙色,如果再次单击,侧菜单不会消失,也不会发生任何事情,直到选择不同的页面。如果单击同一项,IPropertyChanged不会触发…或者它是否会触发并检查是否有更改并进行设置 如何以正确的MVVM方式修复此问题 请注意,在照片中,最后一个选择保持选中状态,再次单击将不会在重新加载页面时发生任何事情。只有点击

我不知道如何将listview中的选定菜单项正确绑定到视图模型中与其关联的load page事件

我现在的方式很有效。但是,问题是,当从左侧滑动菜单时,菜单页面保持选中状态,仍然突出显示为橙色,如果再次单击,侧菜单不会消失,也不会发生任何事情,直到选择不同的页面。如果单击同一项,IPropertyChanged不会触发…或者它是否会触发并检查是否有更改并进行设置

如何以正确的MVVM方式修复此问题

请注意,在照片中,最后一个选择保持选中状态,再次单击将不会在重新加载页面时发生任何事情。只有点击另一个页面才有效

母版详细信息页面:

<?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:views="clr-namespace:MyApp.Views"
                  x:Class="MyApp.Views.MyMainPage"
                  Title="My Main Page">


    <MasterDetailPage.Master>
        <ContentPage Title="Menu">
            <ContentPage.Content>

                <Grid BackgroundColor="Transparent">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="130" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>

                    <Grid>
                        <Image Source="menu_background.png" 
                       Aspect="AspectFill" />

                        <StackLayout Padding="0,20,0,0" 
                             HorizontalOptions="CenterAndExpand" 
                             VerticalOptions="CenterAndExpand">

                            <Image Source="ac_logo.png" 
                           Aspect="AspectFit" 
                           WidthRequest="60" 
                           HeightRequest="60" />

                            <Label Text="myAC" TextColor="White" FontSize="Large" />

                        </StackLayout>
                    </Grid>
                    <StackLayout Grid.Row="1" 
                         Spacing="15">

                        <ListView ItemsSource="{Binding MenuList}"
                                  SelectedItem="{Binding MenuSelectedItem, Mode=TwoWay}"
                          RowHeight="45"
                          SeparatorVisibility="Default"
                          BackgroundColor="#e8e8e8">

                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <ViewCell>
                                        <StackLayout>
                                            <!-- Main design for our menu items -->
                                            <StackLayout VerticalOptions="FillAndExpand"
                                                 Orientation="Horizontal"
                                                 Padding="20,10,0,10"
                                                 Spacing="20">

                                                <Image Source="{Binding IconSource}"
                                                WidthRequest="30"
                                                HeightRequest="30"
                                                VerticalOptions="Center" />

                                                <Label Text="{Binding Title}"
                                                FontSize="Medium"
                                                VerticalOptions="Center"
                                                TextColor="Black"/>
                                            </StackLayout>

                                            <BoxView HeightRequest="1" BackgroundColor="Gray"/>
                                        </StackLayout>
                                    </ViewCell>
                                </DataTemplate>
                            </ListView.ItemTemplate>

                        </ListView>
                    </StackLayout>
                </Grid>

            </ContentPage.Content>

        </ContentPage>
    </MasterDetailPage.Master>


    <MasterDetailPage.Detail>
        <NavigationPage>
            <x:Arguments>
                <views:StudentHomePage />
            </x:Arguments>
        </NavigationPage>
    </MasterDetailPage.Detail>


</MasterDetailPage>
最后是MasterPageDetail页CS:

public partial class MyMainPage : MasterDetailPage
    {
        private MyMainPageVM myMainPageVM;
        public MyMainPage ()
        {
            InitializeComponent ();
            myMainPageVM = new MyMainPageVM();
            this.BindingContext = myMainPageVM       

        }        
    }
导航到新页面时,必须设置ListView.SelectedItem=null以删除所选项目的hightLight状态

要访问ListView,首先,在MasterDetailPage.xaml中为ListView指定一个名称:

然后,您可以访问其他类中的listView,在导航后设置SelectedItem=null:

private MenuPageItem _menuSelectedItem = null;
public MenuPageItem MenuSelectedItem
{
    get
    {
        return _menuSelectedItem;
    }

    set
    {           
        _menuSelectedItem = value;

        (App.Current.MainPage as MasterDetailPage).Detail = new NavigationPage((Page)Activator.CreateInstance(_menuSelectedItem.TargetType));

        //Set the SelectedItem=null
        MyMainPage.masterList.SelectedItem = null;

        (App.Current.MainPage as MasterDetailPage).IsPresented = false;

    }
}

让我知道它是否有效。

。这是一个很好的解决方案,非常感谢。但它是完全符合MVVM标准还是有点黑客行为?因为据我所知,视图模型应该对视图一无所知,但在这里,我们特别从viewmodel进入viewlist,将所选项目设置为null。使用带有bindable命令的点击手势会更符合MVVM,并被认为是更好的解决方案吗?我还没试过,但我在论坛上有了一个想法。你怎么认为?当想要完全服从MVVM时,Xamarin是否也有点限制?@EmilRR1您可以检查,这是一个MVVM项目。我只是按照您的逻辑尝试访问listView。
public partial class MyMainPage : MasterDetailPage
    {
        private MyMainPageVM myMainPageVM;
        public MyMainPage ()
        {
            InitializeComponent ();
            myMainPageVM = new MyMainPageVM();
            this.BindingContext = myMainPageVM       

        }        
    }
<ListView ItemsSource="{Binding MenuList}"
                          electedItem="{Binding MenuSelectedItem, Mode=TwoWay}"
                          RowHeight="45"
                          SeparatorVisibility="Default"
                          BackgroundColor="#e8e8e8"

                          x:Name="masterListView">
public partial class MyMainPage : MasterDetailPage
{
    private MyMainPageVM myMainPageVM;


    public static ListView masterList;

    public MyMainPage ()
    {
        InitializeComponent();

        myMainPageVM = new MyMainPageVM();
        //bindingContext = myMainPageVM;
        BindingContext = myMainPageVM;

        //Set the masterList
        masterList = masterListView;
    }
}
private MenuPageItem _menuSelectedItem = null;
public MenuPageItem MenuSelectedItem
{
    get
    {
        return _menuSelectedItem;
    }

    set
    {           
        _menuSelectedItem = value;

        (App.Current.MainPage as MasterDetailPage).Detail = new NavigationPage((Page)Activator.CreateInstance(_menuSelectedItem.TargetType));

        //Set the SelectedItem=null
        MyMainPage.masterList.SelectedItem = null;

        (App.Current.MainPage as MasterDetailPage).IsPresented = false;

    }
}