Когда вы создаете 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, вы должны привязать свойство Command элемента MenuItem к команде в вашей ViewModel ...
<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 и сделает его невидимым для конечного пользователя. Второй просто отключит команду, но он все равно будет виден в «недоступном» состоянии.