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