0

我正在开发一个具有许多用户角色的 WinRT 应用程序。我的应用程序中许多页面的视图根据用户角色而变化

例如。我有一个学生角色和一个教授角色。当学生登录时,他将看到收到的个人信息、绩效图表、待办事项和徽章,当教授登录时,她将看到收到的个人信息、待办事项和反馈

我如何只显示必要的组件?

绑定 Grid.Visibility 是这样做的好方法还是有更好的方法?

更新:
按照@Ahmed(下面的答案)建议的方式进行操作,我将加载设计中的所有控件,并且只会更改它的可见性。我的页面仍然很重。

无论如何我只能加载我希望看到的控件

4

2 回答 2

1

当然有很多方法可以组成你的 UI。

  • 您可以Visibility按照建议使用来显示或隐藏 UI 的各个部分。
  • 您可以使用VisualStateManager显示或隐藏各种视图,甚至更改模板。
  • 您可以使用ItemsControlwithItemTemplateSelector来根据来自视图模型的输入集合显示不同的项目 - 例如,对于学生来说ItemsSourceItemsControl将绑定到视图模型的集合以获取个人信息、性能图表、待办事项和收到的徽章以及教授,您将获得个人信息、待办事项和收到的反馈的视图模型。这ItemTemplateSelector将为这些特定项目提供不同的视图。
  • 您还可以使用ItemsControlwithItemTemplateSelector来显示相同​​视图模型的不同视图,具体取决于您将传递给选择器的用户角色。
  • 您可以将 aContentControl与自定义一起使用,该自定义将根据绑定到属性ContentTemplateSelector的视图模型中提供的用户角色信息提供不同的视图。Content
  • 您可以在后面编写一些代码来根据用户角色显示/隐藏/添加/删除 UI 组件。
  • 您可以将各种视图(徽章、个人信息、反馈等)封装在单独UserControl的视图中,并使用上述任何技术来显示/隐藏特定视图。
  • 您可以为不同的用户角色设计不同的页面,具体取决于角色 - 导航到特定页面。
  • 最后,您可以为不同的用户角色创建单独的应用程序。

以上所有内容都将从使用 MVVM 模式中受益匪浅。技术的选择或技术的组合将取决于您想要显示的信息、应该如何布局、您希望它的可维护性与最初开发的速度、您希望它的安全性和最后你知道多少,愿意学习或者有时间去做。

如果没有太多角色——我个人可能会为每个角色创建一个单独的应用程序并尽可能多地重用代码,尽管这也取决于其他一些要求——比如两个人访问系统的能力相同的设备。我根本不会使用显示/隐藏技术,因为这仍然需要加载 UI、耗尽内存等。大多数应用程序都有某种中央集线器/仪表板,实现为 GridView 或其他一些布局并显示缩短的预览的数据/链接以转到详细视图或完整列表。这是我将在视图模型中为不同角色提供不同数据的地方。详细信息页面可能不需要太多自定义,因为每个角色的数据看起来几乎相同,或者某些角色根本无法访问。当然,根据权限,某些人可能被允许编辑或查看更多/更少的数据。对于这种较小的差异,您可以使用模板选择器,从视图模型中提供不同的数据,并使用命令绑定控制编辑按钮的可见性。

答案可能非常广泛和模糊,因为这里很大程度上取决于您的特定设计和要求。

于 2013-05-28T17:36:52.760 回答
0

你可以像这样制作自己的转换器,这将根据角色改变可见性

 public class RoleToVisibilityConverter : IValueConverter
 {
   public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
   {
    var user= value as User;
    if(user!= null) {
        return user.IsInRole((string)parameter) ? Visibility.Visible : Visibility.Collapsed;
   }
    return null;
   }

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo   culture)
  {
     throw new NotImplementedException();
  }
 }

在您的 XAML 中,您可以使用转换器来设置控件的可见性,如下所示

<Control Visibility={Binding Path=CurrentUser, Converter={StaticResource RoleToVisibilityConverter}, ConverterParameter=Student }/>
于 2013-05-24T05:03:36.607 回答