[英]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());
}
祝你好运!
只是想分享一下我刚刚解决了这个问题。 这是如何:
我完全删除了 AppShellViewModel.cs 并将其内容放入 AppShell.xaml.cs(后面的代码)
我没有使用 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.