在XAML模板中,我使用了一个列表框来填充一些动态数据。
现在我想禁用Windows Phone 7中某些列表框项目中的触摸选择。怎么做?
我做了一些小研究,有些人说可以在列表框中阻止选择事件。
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/8eeed347-ede5-4a24-88f1-953acd16e774
希望一些聪明人可以教我如何解决问题。
感谢。
答案 0 :(得分:10)
您可以使用ItemsControl而不是ListBox。 ItemsControl就像ListBox,但没有选择的东西。
<ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 1 :(得分:1)
使用包含在ScrollViewer中的ItemsControl。这将在没有选择的情况下为您提供相同的效果(并且允许您像ListBox一样滚动)
<ScrollViewer>
<ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
答案 2 :(得分:0)
尝试使用变量存储最后选择的索引。
如果用户随后选择了您不想处理选择事件的项目,则将所选索引设置回存储值。如果你想要提交; e选择更改事件,那么一定要更新你的存储值。
您可能还希望避免在手动设置索引(后退)时触发更改选择 可以使用一个简单的布尔标志来跟踪它。
答案 3 :(得分:0)
旧问题,但它看起来没有回答。你可以通过代码,操纵选定的项目和索引来完成它,但这很丑陋而且很麻烦。相反,让我们用你的绑定项以声明方式(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");
}
}
}
上面的示例假定ViewModelBase和RaisePropertyChanged方法使用MVVM Light,但您可以自己使用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>
就是这样。现在只需加载一些包含项目列表的viewmodel:
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 });
此示例中只有科幻电影可以点击。
希望有所帮助。