【问题标题】:How to disable selection a single item in a GridView如何禁用选择 GridView 中的单个项目
【发布时间】:2012-05-25 11:00:34
【问题描述】:

如何从 GridView 禁用选择单个项目?

我有一个 GridView,它的 ItemsSource 绑定到 IEnumerable。我希望能够以编程方式不允许选择列表中的某些项目,同时允许选择其他项目。

【问题讨论】:

    标签: windows-8 windows-runtime winrt-xaml


    【解决方案1】:

    虽然我没有这样做,但您应该能够在 GridView 上使用 ItemContainerStyleSelector,该方法为您提供容器 (GridViewItem) 和您要绑定的项目。从那里您可以将 GridViewItem 上的 IsEnabled 属性设置为 false ,使其无法选择。

    您可能还需要选择自定义样式,因为默认的 GridViewItem 样式将自定义禁用项目的外观。

    更新 DataTemplateSelector 解决方案

    public class IssueGridTemplateSelector : DataTemplateSelector
    {
        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
        {
            var selectorItem = container as SelectorItem;
    
            if (item is Issue)
                return IssueTemplate;
    
            selectorItem.IsEnabled = false;
            selectorItem.Style = RepositoryItemStyle;
    
            return RepositoryTemplate;
        }
    
        public DataTemplate IssueTemplate
        {
            get;
            set;
        }
    
        public DataTemplate RepositoryTemplate
        {
            get;
            set;
        }
    
        public Style RepositoryItemStyle
        {
            get;
            set;
        }
    }
    

    【讨论】:

    • 我也成功地使用 DataTemplateSelector 修改了容器样式,有点小技巧,但我已经在使用 DTS,所以用一块石头杀死了两只鸟。我已经用该代码更新了我的答案。
    • 如果我想让所有项目都可点击并在其中一些项目上显示选择,该怎么办?有其他选择吗?
    【解决方案2】:

    奈杰尔的回答很棒。我刚刚在WinRT XAML Toolkit 中添加了一些附加属性,如果您使用 ItemsSource 属性绑定来填充 GridView,这应该会使操作更简单。

    对我来说,修改 GridViewItem 属性的常用方法是使用 GridView.ItemContainerStyle 属性。使用该方法,您需要使用样式指定 IsEnabled 属性,并且样式设置器不支持 WinRT 中的绑定。使用 ItemContainerStyleSelector 可能是一种方法,但它需要定义一个自定义类。

    我创建了一个带有 IsEnabled 属性的 GridViewItemExtensions class,您可以像这样在 GridView.ItemTemplate 中的任何控件上设置该属性:

    xmlns:xyzc="using:Xyzzer.WinRT.Controls"
    xyzc:GridViewItemExtensions.IsEnabled="{Binding IsEnabled}"
    

    该属性具有在其祖先可视化树中查找 GridViewItem 并保持其 IsEnabled 值与其后代上设置的 GridViewItemExtensions.IsEnabled 值同步的行为。

    然后正如 Nigel 所说 - 您仍然需要从 GridViewItem 中提取模板并对其进行修改,以使禁用的项目看起来不合适。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 2021-10-29
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多