如何禁用GridView中的单个项目选择

Mic*_*ael 6 windows-8 windows-runtime winrt-xaml

如何禁用GridView中的选择单项?

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

Nig*_*son 7

虽然我没有这样做,你应该可以在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 似乎有一个错误.http://www.simonferquel.net/blog/archive/2012/03/14/windows-8--xaml-petit-bug-sur-itemscontrol-et-workaround.aspx (2认同)

Fil*_*kun 6

奈杰尔的答案很棒.我刚刚在WinRT XAML Toolkit中添加了一些附加属性,如果使用ItemsSource属性绑定填充GridView,应该可以更简单.

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

我创建了一个带有IsEnabled属性的GridViewItemExtensions类,您可以在GridView.ItemTemplate中的任何控件上设置它,如下所示:

xmlns:xyzc="using:Xyzzer.WinRT.Controls"
xyzc:GridViewItemExtensions.IsEnabled="{Binding IsEnabled}"
Run Code Online (Sandbox Code Playgroud)

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

然后正如Nigel所说 - 你仍然需要从GridViewItem中提取模板并修改它,以便禁用的项目看起来不合适.