ListView. Реалізація власного виділення

У цій статті буде розглянуто як розширити функціональність ListView за рахунок доопрацювання контейнера для елементів списку.

Ціль, або що хочемо отримати

Оскільки найкраще ілюструвати щось на конкретних ситуаціях, то поставимо таку мету: дозволити виділяти поточний елемент списку натисканням пропуску. Дане виділення: — має залежати від поточного поведінки ListView (властивості SelectionMode); — має відрізнятися від «звичайного» виділення елемента списку; - не повинно скидатися при втраті фокусу ListView; — не повинно змінюватися при роботі зі стандартними властивостями, що відповідають за виділені елементи списку (приклад: SelectedItem, SelectedIndex). Отже, приступимо. Для вирішення поставленої задачі ми виконаємо наступні кроки: - створимо свій контейнер для елементів списку, який розширимо новою властивістю IsSpaceSelect. Дана властивість визначатиме виділений елемент списку нашим способом чи ні; - створимо свій control ListView, що за замовчуванням працює з нашим контейнером; -змінимо візуальне оформлення виділеного елемента.

1. Створення нового контейнера для списку елементів.

Отже, ми маємо свій контейнер елемента з властивістю IsSpaceSelect.

Переходимо до етапу 2 - змусимо ListView працювати з нашим контейнером

/// True, якщо можна виділяти елементи пропуском

public bool IsSpaceSelectedMode

/// Реєструємо властивість "Дозволено виділяти елементи пропуском"

public static readonly DependencyProperty IsSpaceSelectedModeProperty =

DependencyProperty.Register( "IsSpaceSelectedMode" , typeof (Boolean), typeof (SpaceListView), new PropertyMetadata( false ));

Trigger Property = "IsSpaceSelectedMode" Value = "true" >

Setter Property="ItemContainerStyle" >

Trigger Property = "IsSpaceSelect" Value = "true" >

Setter Property ="Foreground" Value ="DarkBlue" />

Setter Property = "Background" >

LinearGradientBrush EndPoint ="0.5,1" StartPoint ="0.5,0" >

GradientStop Color = "#FFFFC704" Offset = "0.986" />

GradientStop Color = "#FFF4E057" Offset = "0.5" />

GradientStop Color = "#FFF4E057" Offset = "0.51" />