silverlight開發實例(Prism+MVVM+RIA)(四)--設置菜單權限

在菜單加載後需要根據登錄人身份對菜單進行權限控制,此例是對菜單是否可用進行控制,由於原有的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中下方的狀態條功能。
發佈了57 篇原創文章 · 獲贊 7 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章