虽然这是一个旧问题,但似乎没有得到解答。你可以通过代码操作选定的项和索引来实现,但那样很丑陋且繁琐。相反,让我们以声明方式(XAML方式!)使用绑定项。
首先,您需要一个ViewModel,其中包含一系列项目。每个项目都需要(至少)一个用于显示的属性和一个用于确定该项目是否启用的属性。
以下是单个列表项的示例视图模型:
class MyViewModel : ViewModelBase
{
private string _title;
public string Title
{
get { return _title; }
set
{
if(value == _title) return;
_title = value;
RaisePropertyChanged("Title");
}
}
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
if(value == _isEnabled) return;
_isEnabled = value;
RaisePropertyChanged("IsEnabled");
}
}
}
上面的示例假定使用MVVM Light作为ViewModelBase和RaisePropertyChanged方法,但您也可以使用IPropertyNotified(或任何其他MVVM库)自己完成它。
接下来,您将拥有一个类似以下标记的列表框:
<ListBox ItemsSource="">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter IsHitTestVisible=""/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text=""/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
就是这样。现在只需加载一些带有项目列表的视图模型:
MainViewModel.MyItems = new ObservableCollection<MyViewModel>();
MainViewModel.MyItems.Add(new MyViewModel { Title = "Star Wars", IsEnabled = true });
MainViewModel.MyItems.Add(new MyViewModel { Title = "The Sound of Music", IsEnabled = false });
MainViewModel.MyItems.Add(new MyViewModel { Title = "Aliens", IsEnabled = true });
MainViewModel.MyItems.Add(new MyViewModel { Title = "Debbie Does Dallas", IsEnabled = false });
MainViewModel.MyItems.Add(new MyViewModel { Title = "True Grit", IsEnabled = false });
在此示例中,只有科幻电影是可点击的。
希望有所帮助。