Привязка GridViewItem IsSelected в приложении UWP

У нас есть требование отображать изображения в GridView постепенно. Таким образом, чтобы найти выбранные элементы в GridView , свойство IsSelected элемента GridView связано с соответствующим свойством объектов привязки CLR object (свойство типа GridView's ItemSource). Поскольку UWP не поддерживает привязку RelativeSouce и сеттера по стилю, поэтому после поиска в Интернете мы нашли приведенный ниже код.

public class GridViewEx : GridView
{

        protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)
        {
            base.PrepareContainerForItemOverride(element, item);
            var gridItem = element as GridViewItem;

            var binding = new Binding { Mode = BindingMode.TwoWay, Source = item, Path = new PropertyPath("IsSelected") };
            gridItem.SetBinding(SelectorItem.IsSelectedProperty, binding);
        }

} 

Но кажется, что в вышеописанном подходе есть изъян. Всякий раз, когда страница прокручивается вниз для загрузки следующего набора фотографий, предыдущие выбранные элементы теряют свой выбор.

Кто-нибудь сталкивался с этой проблемой раньше или какие-либо предложения по решению вышеуказанной проблемы?


person user1672994    schedule 11.04.2016    source источник


Ответы (1)


Переместите IsSelected в класс модели и привяжите его к пользовательскому элементу управления. Пользовательский элемент управления на самом деле является ячейкой и будет помещен в ваш шаблон данных.

<GridView.ItemTemplate>
    <DataTemplate>
        <controls:MyCustomControl IsSelected="{Binding IsSelected}"/>
    </DataTemplate>
</GridView.ItemTemplate>

В MyCustomControl вы будете обрабатывать разное визуальное состояние, чтобы показать выбранный статус элемента. Таким образом, ваша ViewModel вообще не должна «знать» список, когда вам нужно просто получить список выбранного элемента из вашего списка моделей.

person thang2410199    schedule 11.04.2016
comment
Но как выполнить привязку к GridViewItem.IsSelectedProperty, чтобы установить IsSelected в фоновом режиме для любого выбранного пользователем элемента на странице? - person user1672994; 11.04.2016
comment
когда пользователь нажимает на элемент, получает модель, получает свойство IsSelected, устанавливает для него значение true. Забудьте о GridViewItem.IsSelectedProperty, он не имеет никакого отношения, так как я его игнорирую в своем образце. - person thang2410199; 11.04.2016
comment
Кто угодно? это жизненно важно почти для каждого приложения, которое я знаю, и нет надежного способа сделать это. - person SuperJMN; 25.03.2017