silverlight开发实例(Prism+MVVM+RIA)(四)--设置菜单权限

来源:互联网 发布:哔哩哔哩软件 编辑:程序博客网 时间:2024/06/13 02:27

在菜单加载后需要根据登录人身份对菜单进行权限控制,此例是对菜单是否可用进行控制,由于原有的Model中并没有一个字段去标示菜单是否可以,那么需要重载菜单类,添加属性比便可以绑定到菜单项的IsEnabled,在判断时需要将用户的有权菜单列表与当前菜单项的ID进行比较即可。看图


如上图,用户管理当前用户有权操作菜单,而其他菜单无权操作显示为灰色。具体实现如下:

1、重载菜单Model,增加控制属性,此处需要注意的是该类的命名空间需要与共享代码的命名空间一致。

 public partial class T_SYS_APPLICATION    {        bool isEnabled = false;        public bool IsEnabled        {            get            {                return isEnabled;            }            set            {                isEnabled = value;                RaisePropertyChanged("IsEnabled");            }        }        bool isSelected = false;        public bool IsSelected        {            get            {                return isSelected;            }            set            {                isSelected = value;                RaisePropertyChanged("IsSelected");            }        }    }

2、在加载菜单项时对菜单项的控制属性进行设置

void applicationService_GetApplicationListQueryComplete(object sender, EntityResultsArgs<T_SYS_APPLICATION> e)        {            this.ApplicationList.Clear();            if (!e.HasError)            {                foreach (var u in e.Results)                {                    u.IsEnabled = GetCurrentAppEnabled(u.SAPPLICATIONID);                    this.ApplicationList.Add(u);                }            }                  }

bool GetCurrentAppEnabled(string appid)        {            //bool bEnable = false;            var u = from n in this.UserAppList where n.SAPPLICATIONID == appid select n;            if (u == null || u.Count<V_SYS_USERAPPLICATION>()==0)                return false;            else                return true;        }

3、此例中的菜单项采用的是ListBox,对菜单项的鼠标放下事件进行事件绑定,模拟鼠标点击,同时为了能够实现无权菜单显示为灰色,需要在Listbox中的菜单项模版中加入一个Rectangle,并通过绑定opacity设置是否显示,为此还需要加入一个转换的类,将bool转换为visabled。

 void OnAppSelectedChanged(T_SYS_APPLICATION selectedApp)        {            if (selectedApp != null && !string.IsNullOrEmpty(selectedApp.SURL) && selectedApp.IsEnabled)            {                                this.regionManager.RequestNavigate(RegionNames.MainContentRegion, selectedApp.SURL);                this.eventAggregator.GetEvent<CommandEvent>().Publish(new CommandEventPara() { CommandName = "ApplicationSelectedChanged", Entity = selectedApp });            }        }

 public class VisibilityConverter : IValueConverter    {        #region IValueConverter Members        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)        {            return System.Convert.ToBoolean(value) ? Visibility.Collapsed : Visibility.Visible;        }        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)        {            return (Visibility)value == Visibility.Visible;        }        #endregion    }

<Rectangle x:Name="rectangle" Fill="#B3B1B1B4" Margin="0" Stroke="Black" Visibility="{Binding IsEnabled, Converter={StaticResource VisibilityConverter}}" RadiusY="5" RadiusX="5" StrokeThickness="0"/>

这样一个基本的用户导航页面就完成了,后期还可将用户操作的菜单项加入到下方一个Listbox中,这样通过对listbox项目进行切换实现主操作界面的切换,类似windows中下方的状态条功能。

原创粉丝点击