0

我正在为 GUI 编写授权框架。用户使用有效凭据登录,并显示用户有权访问的菜单选项(按钮)。

我计划根据分配给用户的权限显示或隐藏按钮可见性。

我正在努力思考以编程方式引用和切换按钮可见性的最佳方法。我有一个列表,其中详细说明了哪些菜单项应该可见或不可见,但我不知道如何针对表单上的按钮引用该列表。

我可以轻松地键入每个按钮对象的名称并针对列表进行测试并切换按钮的可见性,但这对我来说似乎不是很有效。

代码如下。我怎样才能最好地启用/禁用按钮项?

class Menu
{
    public int Id { get; set; }
    public string MenuItemFriendlyName { get; set; }
    public string ButtonName { get; set; }
    public bool Visable { get; set; }

    public List<Menu> CalculateMenuAccessForUser(User userDetails)
    {
        var menuItems = AllMenuItemsInSystem();

        foreach (var pt in userDetails.PermissionTable)
        {
            if(pt.Type != "Menu")
                break;

            if (menuItems.Exists(x => x.Id.Equals(pt.Id)))
            {
                var index = menuItems.FindIndex(y => y.Id.Equals(pt.Id));

                menuItems[index].Visable = true;
            }
        }

        return menuItems;
    }

    private List<Menu> AllMenuItemsInSystem()
    {
        var menu = new List<Menu>();

        using (var sqlconnection = new SqlConnection(Globals.AFWideSettings.SqlConnectionString))
        {
            sqlconnection.Open();
            using (
                var sqlcommand =
                    new SqlCommand("select name, permissionid from PermissionListTable where type = 'Menu'",
                                   sqlconnection))
            {
                var resultReader = sqlcommand.ExecuteReader();

                while (resultReader.Read())
                {
                    menu.Add(new Menu(){MenuItemFriendlyName = resultReader.GetString(0), Id = resultReader.GetInt32(1), Visable = false});
                }
            }
        }

        return menu;
    }
}

class Another{

    void BuildOutlookMenu()
    {
        var buildMenu = new Authentication.Menu();
        var menuBuilder = buildMenu.CalculateMenuAccessForUser(_userDetails);

        foreach (var menu in menuBuilder)
        {
            if (menu.Visable)
            {
                //Here I wish to enable or disable my menu buttons
                //BUTTON.Visibility = Visibility.Visible;
            }                
        }
    }
}
4

1 回答 1

0

您将需要以某种方式将每个按钮与您的菜单相关联,我可能会使用该Tag属性为您的按钮分配一个索引,然后创建一个列表将您的按钮分配给它,然后遍历它以确定是否使其可见或不是。您需要将 Buttons 索引与菜单项上的属性相关联(我以 Tag 作为示例,使用名为 MenuButtons 的列表)。

foreach (var menu in menuBuilder)
{
    if (menu.Visible)
    {
        Button result =  menuButtons.Find(btn => { return (int)btn.Tag == (int)menu.Tag;});
        if(result != null){result.Visibility=Visibility.Visible;}
    }
}
于 2012-12-30T23:18:26.070 回答