簡體   English   中英

Xamarin 根據值隱藏和顯示彈出項目

[英]Xamarin Hiding and showing Flyout Item based on value

遇到這個問題時,我目前正在一點一點地學習xamarin.forms。 我想制作一個應用程序,如果用戶不是管理員,某個彈出項目將被隱藏。 但是,即使在管理員成功登錄后,彈出項目仍保持隱藏狀態。 這是該應用程序的簡化版本。

這是我的 AppShell.xaml 代碼:

<Shell.BindingContext>
     <viewmodel:AppShellViewModel></viewmodel:AppShellViewModel>
 </Shell.BindingContext>
 <ShellItem Route="LoginPage" FlyoutItemIsVisible="False">
     <ShellContent ContentTemplate="{DataTemplate view:LoginPage}"/>
 </ShellItem>
 <FlyoutItem Title="Page 1">
     <ShellContent Route="Page" ContentTemplate="{DataTemplate view:Page}"/>
 </FlyoutItem>
 <FlyoutItem Title="Page 2" IsVisible="{Binding isAdmin}">
     <ShellContent Route="Page2" ContentTemplate="{DataTemplate view:Page2}"/>
 </FlyoutItem>
 <MenuItem Text="isAdmin?" Command="{Binding checkCommand}"/>

AppShellViewModel.cs:

public class AppShellViewModel: BindableObject
 {
     public AppShellViewModel()
     {
         MessagingCenter.Subscribe<LoginViewModel>(this, message: "user", (sender) => {
             _isAdmin = false;
         });
         MessagingCenter.Subscribe<LoginViewModel>(this, message: "admin", (sender) => {
             _isAdmin = true;
         });
         checkCommand = new Command(async () => await checkAdmin());
     }
     private bool _isAdmin;
     public bool isAdmin
     {
         get { return _isAdmin; }
         set
         {
             _isAdmin = value;
             OnPropertyChanged();
         }
     }
     public ICommand checkCommand { get; }
     private async Task checkAdmin()
     {
         string str = $"isAdmin: {_isAdmin}";
         await App.Current.MainPage.DisplayAlert("Alert", str, "OK");
     }
 }

正如我所說, isAdmin將通過登錄方法進行修改。 如果用戶輸入“admin”,isAdmin 將設置為 true,如果是“user”,則設置為 false。

這是我的 LoginPage.xaml:

<ContentPage.BindingContext>
     <viewmodel:LoginViewModel></viewmodel:LoginViewModel>
 </ContentPage.BindingContext>
 <ContentPage.Content>
     <StackLayout>
         <Entry Text="{Binding user}"/>
         <Button Text="Login" Command="{Binding loginCommand}"/>
     </StackLayout>
 </ContentPage.Content>

這是我的 LoginViewModel.cs:

public class LoginViewModel: BindableObject
 {
     public LoginViewModel()
     {
         loginCommand = new Command(async () => await LoginFunc());
     }
     public ICommand loginCommand { get; }
     string _user;
     public string user
     {
         get => _user;
         set
         {
             _user = value;
             OnPropertyChanged();
         }
     }
    
     private async Task LoginFunc()
     {
         if(_user != null)
         {
             MessagingCenter.Send<LoginViewModel>(this, _user);
             await Shell.Current.GoToAsync($"//{nameof(Page)}");
         }
     }
 }

根據上面的代碼,我管理(如果我的方法錯誤請糾正我)使用MessagingCenter修改isAdmin ,如果我單擊“isAdmin?”可以顯示它。 菜單項。

我不知道即使在isAdmin屬性更改后isVisible是否正常工作(當我嘗試初始化isAdmin = true時,即使用戶不是管理員,彈出項目也會繼續顯示)。

如果我收到任何幫助/提示,我將不勝感激。 先感謝您

它不起作用的原因是您沒有更新屬性,而是更新導致 OnPropertyChanged 從未被調用的字段,因此您的 UI 永遠不會更新。

 public AppShellViewModel()
 {
     MessagingCenter.Subscribe<LoginViewModel>(this, message: "user", (sender) => {
         isAdmin = false;
     });
     MessagingCenter.Subscribe<LoginViewModel>(this, message: "admin", (sender) => {
         isAdmin = true;
     });
     checkCommand = new Command(async () => await checkAdmin());
 }

祝你好運!

只是想分享一下我剛剛解決了這個問題。 這是如何:

  1. 我完全刪除了 AppShellViewModel.cs 並將其內容放入 AppShell.xaml.cs(后面的代碼)

  2. 我沒有使用 MessagingCenter,而是使用了以下代碼(代碼包含在登錄功能中)

if(_user == "admin")
{
(Shell.Current as AppShell).isAdmin = true;
}
else
{
(Shell.Current as AppShell).isAdmin = false;
}

但是,我仍在尋找其他解決方案,以便可以將 AppShell 視圖與其視圖模型分開。 因此,如果您有其他解決方案,請在此處發布 ^_^。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM