2013-12-04 3 views
0

Как предотвратить выбор ListViewItem при нажатии на элемент и нажатие (вниз/вверх) стрелки? Я не хочу отключать его, я просто хочу, чтобы его нельзя было выбирать в Shift + Arrow. Некоторые из моих списков должны быть выбраны, а некоторые другие нет.WPF: запретить выбор ListViewItem в Shift + Arrow

Пример:

[ListViewItem 1]

[ListViewItem 2]

[ListViewItem 3]

Пользователь нажимает на ListviewItem1, он получает выбран.

Пользователь затем нажимает кнопку SHIFT + DOWN ARROW, => ListViewItem 2 не выбрано.

В этот момент выбран либо ListViewItem3, либо может потребоваться еще одна стрелка SHIFT + DOWN, чтобы выбрать ListViewItem3 (это не имеет значения до тех пор, пока оно будет выбрано когда-то).

(В моем проекте фактический ListViewItem 2 на самом деле НЕ является обычным элементом в 1 строке, это вертикальный элемент, который охватывает несколько строк всего за один столбец. У моего источника ListView есть композитный набор самых разных элементов, я пытаюсь для выбора того, что, как представляется, является только «регулярными элементами строки»)

+0

Можете ли вы поделиться какой-либо из XAML из этого элемента пользовательского интерфейса? –

ответ

1

Вы можете выполнить это, используя Property вашего класса, например IsSelected. Вот пример кода, для которого будет выглядеть Property.

public bool IsSelected 
{ 
    get 
    { 
     return isSelected;   //return the value of isSelected 
    } 
    set 
    { 
     if (isSelectable)   //if the item is allowed to be selected 
     {       //then update the value of isSelected 
      isSelected = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("IsSelected")); 
     } 
    } 
} 

В этом примере предполагается, что «isSelectable» это значение, которое устанавливается в конструкторе, когда ваш класс инициализируется. Если у вас еще нет INotifyPropertyChanged, это должно быть ... и должно быть объявлено событие PropertyChanged.

Кроме того, вам также понадобится Style, который связывает выбор ListView элементов для этой недвижимости. Вот пример Style, который может это сделать.

<ListView.Resources> 
    <Style TargetType="{x:Type ListViewItem}"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/> 
    </Style> 
</ListView.Resources> 

Вы можете сделать еще один шаг дальше, а также связываться с FocusableProperty. Это сделает так, что при нажатии SHIFT + DOWN он будет пропустить любые предметы, которые вы не можете выбрать и выбрать следующий элемент, который можно выбрать. Я бы выполнил это так, как описано ниже.

public bool Focusable 
{ 
    get 
    { 
     return isSelectable; //if the item is selectable, then it is focusable 
    } 
} 

Кроме того, необходимо будет создать привязку для этого в вашем Style путем создания дополнительного Setter. Это можно сделать следующим образом, внутри того же Style, как и раньше.

<Setter Property="Focusable" Value="{Binding Focusable}"/> 

Попробуйте с и без этого последнего Setter и посмотреть, реализация которых соответствует вашим потребностям.

--------- --------- UPDATE

Если вы хотите выбрать только пункты мыши, вы можете сделать это, подписавшись на ListViewPreviewMouseLeftButtonDown события , Внутри обработчика событий вам нужно будет сначала get the clicked item и вызвать функцию в вашем классе, которая переопределит выбор. Вот пример того, как это делается.

Эта функция будет существовать в вашем UI кода позади и должны быть подписаны на ваши ListView:

private void myListView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    DependencyObject dep = (DependencyObject)e.OriginalSource; 

    while ((dep != null) && !(dep is ListViewItem)) 
    { 
     dep = VisualTreeHelper.GetParent(dep); 
    } 

    if (dep == null) 
     return; 

    object obj = myListView.ItemContainerGenerator.ItemFromContainer(dep); 

    if (obj is MyClass) 
    { 
     foreach (MyClass i in myListView.Items) 
     i.OverrideSelect(false); //unselect all items 

     MyClass item = (MyClass)obj; 
     item.OverrideSelect(true);  //select the item clicked 
    } 
} 

(Примечание: заменить «MyClass» с вашим типом класса).

Эта функция будет существовать в файле класса:

public void OverrideSelect(bool selected) 
{ 
    isSelected = selected; 
    PropertyChanged(this, new PropertyChangedEventArgs("IsSelected")); 
} 
+0

большое спасибо. Как насчет того, если я хочу, чтобы мой ListViewItem выбирался при нажатии, но не выбирался в Shift + Arrow? –

+0

@bayedbest в любое время, когда вы хотите делать что-то «только по щелчку», код начинает немного запутываться, но я обновил свой ответ в меру своих возможностей, основываясь на ваших дополнительных требованиях. – Mash

+0

отлично, спасибо. Таким образом, это выбирает элемент при щелчке, не делает ли он его другим способом? (Например, не на перетаскивании или сдвиге + стрелка) –

Смежные вопросы