Mainpage.xaml - OnNavigatedTo

时间:2011-12-18 16:37:08

标签: silverlight-4.0 mvvm

我正在使用ViewModels开发Silverlight应用程序。

我的MainPage.xaml有一个菜单定义,并基于某些访问级别我想折叠或使某些菜单项可用。

由于OnNavigateTo在我的MainPage.xaml.cs上不可用,我想知道如何做到这一点。

每次用户登录/注销时都应更改菜单

1 个答案:

答案 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并使其对最终用户不可见。第二个将只是禁用命令,但它仍然会在“灰显”状态下可见。