Вы можете выполнить это, используя 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>
Вы можете сделать еще один шаг дальше, а также связываться с Focusable
Property
. Это сделает так, что при нажатии 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
Если вы хотите выбрать только пункты мыши, вы можете сделать это, подписавшись на ListView
PreviewMouseLeftButtonDown
события , Внутри обработчика событий вам нужно будет сначала 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"));
}
Можете ли вы поделиться какой-либо из XAML из этого элемента пользовательского интерфейса? –