Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于角色的视图XAML_Xaml_Mvvm_Windows Runtime_Winrt Xaml - Fatal编程技术网

基于角色的视图XAML

基于角色的视图XAML,xaml,mvvm,windows-runtime,winrt-xaml,Xaml,Mvvm,Windows Runtime,Winrt Xaml,我正在开发一个WinRT应用程序,它有许多用户角色。“我的应用”中许多页面的视图会根据用户角色发生变化 我有一个学生角色和一个教授角色。当学生登录时,他将看到收到的个人信息、绩效表、待办事项和徽章;当教授登录时,她将看到收到的个人信息、待办事项和反馈 如何仅显示必要的组件 绑定Grid.Visibility是一种很好的方法还是有更好的方法 更新: 按照@Ahmed(以下答案)建议的方式进行操作,我将加载设计中的所有控件,并且只更改其可见性。我的页面仍然很重 是否可以只加载我希望看到的控件?您可以

我正在开发一个WinRT应用程序,它有许多用户角色。“我的应用”中许多页面的视图会根据用户角色发生变化

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

如何仅显示必要的组件

绑定Grid.Visibility是一种很好的方法还是有更好的方法

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


是否可以只加载我希望看到的控件?您可以制作一个类似这样的转换器,根据角色改变可见性

 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 }/>

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

  • 您可以根据建议使用
    可见性
    ,以显示或隐藏UI的各个部分
  • 您可以使用
    VisualStateManager
    显示或隐藏各种视图,甚至更改模板
  • 您可以使用带有
    ItemTemplateSelector
    ItemsControl
    来根据视图模型的输入集合显示不同的项目-例如,对于学生来说,
    ItemsControl
    ItemsSource
    将绑定到个人信息、绩效图表、,收到TODO和徽章,对于教授,您将获得个人信息、TODO和收到的反馈的视图模型。
    ItemTemplateSelector
    将提供这些特定项的不同视图
  • 您还可以使用带有
    ItemTemplateSelector
    ItemsControl
    来显示相同视图模型的不同视图,具体取决于要传递给选择器的用户角色
  • 您可以将
    ContentControl
    与自定义控件一起使用,该自定义控件将根据绑定到
    Content
    属性的视图模型中提供的用户角色信息提供不同的视图
  • 您可以编写一些代码,根据用户角色显示/隐藏/添加/删除UI组件
  • 您可以将各种视图(徽章、个人信息、反馈等)封装在每个视图的单独
    UserControl
    s中,并使用上述任何技术显示/隐藏特定视图
  • 您可以为不同的用户角色设计不同的页面,并根据角色导航到特定页面
  • 最后,您可以为不同的用户角色创建单独的应用程序
使用MVVM模式将大大有利于上述所有方面。技术或技术组合的选择取决于您想要显示什么信息、它应该如何布局、您希望它的可维护性与最初开发的速度、您希望它的安全性,以及您知道多少、愿意学习多少或有时间学习多少

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


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

这是正确的方法吗?这样,我将加载设计中的所有控件,只更改其可见性。我的页面仍然会很重,不管怎样,我只能加载我想要查看的控件。我不认为,还有其他方法。嘿,菲利普,我需要你的帮助。对不起,我不处理安全问题。