您可以通过使用您班级的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,看看哪种实现最适合您的需求。
--------- 更新 ---------
如果您只想在鼠标点击时选择项目,您可以通过订阅 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"));
}