我正在使用ViewModels开发Silverlight应用程序。
我的MainPage.xaml有一个菜单定义,并基于某些访问级别我想折叠或使某些菜单项可用。
由于OnNavigateTo在我的MainPage.xaml.cs上不可用,我想知道如何做到这一点。
每次用户登录/注销时都应更改菜单
答案 0 :(得分:1)
为菜单创建MenuItem时,将Visibility绑定到ViewModel中的某个属性......
<StackPanel>
<toolkit:MenuItem Header="Do Something" Visibility="{Binding CanDoSomething}" />
</StackPanel>
可以声明ViewModel中的属性......
public Visibility CanDoSomething { get; set; }
你可以使用ViewModel中的方法切换它......就像这样......
private void SetMenuVisibility()
{
if (UserIsLoggedIn)
{
CanDoSomething = Visibility.Visible;
}
else
{
CanDoSomething = Visibility.Collapsed;
}
OnPropertyChange("CanDoSomething");
}
每当用户登录或注销时,您都会调用此方法。这将以您所述的方式实现折叠或扩展菜单项。每个MenuItem必须绑定到ViewModel中的属性,而ViewModel必须从INotifyPropertyChanged继承。
其次,如果您想使用ICommand模式,您可以将MenuItem的Command属性绑定到ViewModel中的Command ...
<StackPanel>
<toolkit:MenuItem Header="Do Something" Command="{Binding DoSomethingCommand}" />
</StackPanel>
ViewModel会声明一个这样的命令......
public ICommand DoSomethingCommand { get; set; }
并像这样初始化......
private void InitializeDoSomethingCommand()
{
DoSomethingCommand = new RelayCommand
(
ExecuteDoSomething,
param=>UserIsLoggedIn
);
}
我在这里使用了'RelayCommand',但是任何类似的类都会这样做。
这两种方法之间的区别在于,首先会折叠MenuItem并使其对最终用户不可见。第二个将只是禁用命令,但它仍然会在“灰显”状态下可见。