當我遇到這個問題時,我目前正在一點一點地學習 xamarin。如果用戶不是管理員,我想制作一個應用程式,其中某個彈出項將被隱藏。但是,即使在管理員成功登錄后,彈出項仍然隱藏。這是該應用程式的簡化版本。
這是我的 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)}");
}
}
}
根據上面的代碼,我管理(如果我的方法錯誤,請糾正我)修改isAdminby using MessagingCenter,如果我點擊“isAdmin?”可以顯示。選單項。
我不知道isVisible即使在isAdmin屬性更改后它是否仍在作業(當我嘗試初始化時isAdmin = true,即使用戶不是管理員,彈出項也會繼續顯示)。
如果我收到任何幫助/提示,??我將不勝感激。先感謝您
uj5u.com熱心網友回復:
它不起作用的原因是您沒有更新屬性,而是更新導致 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());
}
祝你好運!
uj5u.com熱心網友回復:
只是想分享一下我剛剛解決了這個問題。這是如何:
我完全洗掉了 AppShellViewModel.cs 并將其內容放在 AppShell.xaml.cs 中(后面的代碼)
我沒有使用 MessagingCenter,而是使用了以下內容(代碼包含在登錄功能中)
if(_user == "admin")
{
(Shell.Current as AppShell).isAdmin = true;
}
else
{
(Shell.Current as AppShell).isAdmin = false;
}
但是,我仍在尋找其他解決方案,以便可以分離 AppShell 視圖及其視圖模型。因此,如果您有其他解決方案,請在此處發布^_^。謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/510768.html
標籤:C#xamarin
