老问题,但它看起来没有答案。你可以通过代码来完成,操纵选定的项目和索引,但这很丑陋。相反,让我们用绑定项目声明式地(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投光灯ViewModelBase和RaisePropertyChanged方法,但你可以IPropertyNotified自己(或任何其他MVVM做图书馆)。
接下来,您将有标记类似以下列表框:
<ListBox ItemsSource="{Binding MyItems}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter IsHitTestVisible="{Binding IsEnabled}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}"/>
</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 });
只有在这个例子中,科幻电影是可以点击的。
希望有所帮助。
来源
2011-08-23 05:50:54
Bil
就像一个魅力对我的目的(不需要再整列表框) – Hutjepower 2013-09-12 12:41:07
他问起某些lisboxitem – 2013-09-24 07:29:11