Как отключить выделение одного элемента в GridView

Как отключить выбор одного элемента из GridView?

У меня есть GridView с ItemsSource, привязанным к IEnumerable. Я хотел бы иметь возможность программно не разрешать выбор некоторых элементов в списке, разрешая выбор других.

2 ответов


пока я этого не сделал, вы должны иметь возможность использовать ItemContainerStyleSelector в GridView, метод дает вам контейнер (GridViewItem) и элемент, к которому вы привязываетесь. Оттуда вы можете установить свойство IsEnabled на GridViewItem в 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;
    }
}

ответ Найджела велик. Я просто добавил некоторые свойства к в WinRT XAML в инструментарий это должно упростить выполнение, если вы заполняете GridView с помощью привязки свойства ItemsSource.

для меня обычным способом изменения свойств GridViewItem было использование GridView.Свойство ItemContainerStyle. Используя этот метод, вам нужно будет указать свойство IsEnabled, используя стиль, а установщики стилей не поддерживают привязки в WinRT. С помощью ItemContainerStyleSelector может быть одним из способов, но он требует определения пользовательского класса.

Я создал класс GridViewItemExtensions С свойством IsEnabled, которое можно задать для любого элемента управления в GridView.ItemTemplate, как это:

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

свойство имеет поведение нахождения GridViewItem в визуальном дереве предков и сохранения его IsEnabled значение синхронизировано с GridViewItemExtensions.IsEnabled значение, установленное на его потомок.

тогда, как сказал Найджел, вам все равно нужно извлечь шаблон из GridViewItem и изменить его, чтобы отключенные элементы не выглядели неуместными.