老問題,但它看起來沒有答案。你可以通過代碼來完成,操縱選定的項目和索引,但這很醜陋。相反,讓我們用綁定項目聲明式地(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