【问题标题】:Empty data template in Windows 8 Grid appWindows 8 Grid 应用程序中的空数据模板
【发布时间】:2014-04-25 16:46:30
【问题描述】:

我正在使用默认的 Grid 应用程序模板,但我有一个问题尚未找到好的答案。

如果您只是使用示例数据并从分组中删除所有数据元素,是否有任何方法可以轻松显示仅显示“无项目”的项目模板?

组标题仍然存在,这很好,只是有助于指示项目列表中没有数据。

我尝试了 DataTemplateSelector,但如果不存在任何项目,则不会使用它。有点莫名其妙的是,像 ListView 或 GridView 这样的东西没有 EmptyDataTemplate

编辑 我询问这个​​特定场景的原因是这个应用程序显示了按公司分组的员工。如果添加新公司,我仍然希望显示公司名称,如果单击组的标题,即使没有分配员工,您仍然可以看到有关公司的信息。

因此,即使没有分配员工(项目),我的组标题也应该仍然可见以供导航。我希望在组标题正下方的项目中显示“没有员工在场”之类的内容,但仍让公司信息可见。

例如

公司 1 >

  • 员工 1
  • 员工 2
  • 员工 3

公司 2 >

  • 没有员工在场

单击公司 2 仍会在 GroupDetails 页面上显示有关该公司的信息。

【问题讨论】:

    标签: c# xaml windows-8


    【解决方案1】:

    我设法通过结合另一个问题here 和在我的组中插入一个空项目来解决我的问题。

    所以我用空数据插入了一个虚假员工,然后调整了我的 DataTemplate。诀窍是使用对象的绑定 container 并为符合特定条件的项目禁用它。

    public class CompanyTemplateSelector : DataTemplateSelector
    {
        protected override Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container)
        {
            var containingItem = container as GridViewItem;
    
            if (item is UserDetails)
            {
                UserDetails detail = (UserDetails)item;
                if (detail.UserId == -1) 
                {
                    containingItem.IsEnabled = false;
                    return Empty;
                }
                else
                {
                    containingItem.IsEnabled = true;
                    return DataPresent;
                }
            }
    
            return DataPresent;
        }
    
        public DataTemplate DataPresent
        {
            get;
            set; 
        }
    
        public DataTemplate Empty
        {
            get;
            set; 
        }
    }
    

    所以我的结果如下

    然后点击标题后

    【讨论】:

      【解决方案2】:

      DataTemplateSelector 是您最好的选择,如果您想显示组标题并显示组中没有项目。更好的选择可能是不显示空组 - 使用GroupStyle.HidesIfEmpty

      【讨论】:

      • 我可以隐藏空组,但如果我真的想显示空组怎么办。当绑定到 GridView 的 ItemTemplateSelector 属性时,DataTemplateSelector 将不起作用,因为没有任何项目可以检查要选择的模板。所以像ItemTemplateSelector="{StaticResource ItemsPresentSelector}" 这样的绑定不会显示任何东西。我滚动了一个自定义 TemplateSelector,当单步执行时,断点只命中包含项目的组。将更新我的问题以可能更有意义地解决我的问题。
      • 哦,你需要在模板选择器使用的组中添加一个存根项,以指示该组为空。
      • 坐在这里想了想之后,我希望这不是答案,但这也是我能想到的唯一其他解决方案。
      • 您也可以在组标题中添加一些内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多