基于角色的查看XAML

时间:2013-05-24 04:50:26

标签: xaml mvvm windows-runtime winrt-xaml

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

进行更改

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

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

绑定Grid.Visibility是一种很好的方法吗?或者有更好的方法吗?

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

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

2 个答案:

答案 0 :(得分:1)

有很多方法可以构建您的UI。

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

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

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

答案可能相当宽泛和模糊,因为这里的很多内容取决于您的具体设计和要求。

答案 1 :(得分: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 }/>