c# - WinRT gridview 添加磁贴

标签 c# windows gridview windows-runtime

我有一个 GridView,它绑定(bind)到项目的 List。我希望它有一个静态项目,以便用户可以单击它来添加更多项目。如果我点击其他项目,我会生成一个项目详细信息页面。

我怎样才能拥有与 GridView 中的所有其他网格项目行为完全不同的静态图 block ?就像下图中的最后一个图 block 。

enter image description here

最佳答案

在我们的项目中,我们找到了一个干净的解决方案来做到这一点:您的 GridView ItemsSource 绑定(bind)到 ViewModel 的集合。最后一个可以是众所周知的 VM,例如 LoadMoreViewModel 实例。

它允许您创建 DataTemplateSelector 实现并将其设置为 GridView 的 ItemTemplateSelector 属性。

public class LoadMoreTemplateSelector: DataTemplateSelector
{
    public DataTemplate LoadMoreTemplate { get; set; }
    public DataTemplate DefaultTemplate { get; set; }


    protected override Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container)
    {
        if (item is LoadMoreViewModel)
        {
            return LoadMoreTemplate;
        }
        else
        {
           return DefaultTemplate;
        }
    }
}

在您的 xaml 文件中创建此 TemplateSelector 的实例作为资源,并设置适当的模板:

<selectors:LoadMoreTemplateSelector x:Key="LoadMoreTemplateSelector" 
       DefaultTemplate="{StaticResource Template1}" 
       LoadMoreTemplate="{StaticResource LoadMoreTemplate}"/>

您的 gridView 可以使用此模板选择器

<GridView ...
    ItemTemplateSelector="{StaticResource LoadMoreTemplateSelector}" />

LoadMoreTemplate 应如下所示:

<DataTemplate x:Key="LoadMoreTemplate">
   <Button Command="{Binding LoadMore}" Content="+"/>
</DataTemplate>

唯一剩下的问题是您必须在 LoadMoreViewModel 中实现一个 ICommand 以将加载更多按钮绑定(bind)到模板中,或者创建一个 UserControl 以便能够对 Click 事件使用react。

编辑: 这是一个简单的 ICommand 实现。单击按钮时,它将执行传递给构造函数的操作。

public class DelegateCommand : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action<object> _execute;

    public event EventHandler CanExecuteChanged;

    public DelegateCommand(Action<object> execute) 
                   : this(execute, null)
    {
    }

    public DelegateCommand(Action<object> execute, 
                   Predicate<object> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public override bool CanExecute(object parameter)
    {
        if (_canExecute == null)
        {
            return true;
        }

        return _canExecute(parameter);
    }

    public override void Execute(object parameter)
    {
        _execute(parameter);
    }

    public void RaiseCanExecuteChanged()
    {
        if( CanExecuteChanged != null )
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }
    }
}

当您实例化 LoadMoreViewModel 时,您可以提供当用户单击加载更多按钮时要执行的操作。

public class LoadMoreViewModel:BindableBase
{
   public ICommand LoadMore{get;private set;}
   public LoadMoreViewModel(Action<object> action)
   {
     LoadMore = new DelegateCommand(action);
   }
}

并且在页面 ViewModel 中,当在列表中加载更多项目时,删除列表末尾的当前 LoadMoreViewModel,然后添加其他项目,最后再次添加 LoadMoreViewModel(如果需要):

public void LoadMoreItems()
{
  if(Items.Last() is LoadMoreViewModel)
  {
    Items.Remove(Items.Last());
  }
  //Insert here add new items logic.
  Items.Add(new LoadMoreViewModel(_=>LoadMoreItems());
}

关于c# - WinRT gridview 添加磁贴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13223958/

相关文章:

c# - 使用 gridview 中的复选框获取删除的行数

c# - 如何根据 Authorization header 值授权请求?

c# - 如何在 C# .NET 中计算 CPU 平均负载

ruby-on-rails - Rails 对 View if-end 语句搞砸了 Linux/Apache/FastCGI 上的渲染的评论

html - 将 CSS 类应用于 gridview 不起作用

android - 在类别之间移动时性能缓慢(项目导航 View )

c# - 在使用 ASP.NET Web API 2.0 和身份进行外部登录/注册期间从 Facebook 检索其他个人资料信息

c# - block 分配

c# - 在字符串列表列表中查找常见项目

python - 在 python 中精确 sleep