在菜單加載後需要根據登錄人身份對菜單進行權限控制,此例是對菜單是否可用進行控制,由於原有的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中下方的狀態條功能。