2010-10-29 63 views
4

在XAML模板中,我使用了一个列表框来填充一些动态数据。如何在Windows Phone 7的列表框项中禁用触摸选择?

现在我想在Windows Phone 7的某些列表框项中禁用触摸选择。怎么做?

我已经做了一些小的研究,有人说可以在列表框中阻止选择事件。

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/8eeed347-ede5-4a24-88f1-953acd16e774

希望一些聪明的家伙能教我如何解决这个问题。

谢谢。

回答

0

尝试使用变量来存储上次选择的索引。

如果用户然后选择一个您不想处理选择事件的项目,然后将选定的索引设置回存储的值。如果您确实想要手动; e选择更改了事件,请务必更新您的存储值。

您可能还希望避免触发手动设置索引(后退)时更改的选择。
一个简单的布尔标志可以用来跟踪这个。

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"); 
     } 
    } 
} 

上面的例子假设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 }); 

只有在这个例子中,科幻电影是可以点击的。

希望有所帮助。

10

您可以使用ItemsControl而不是ListBox。 ItemsControl就像ListBox,但它没有选择的东西。

<ItemsControl> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     ... 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

就像一个魅力对我的目的(不需要再整列表框) – Hutjepower 2013-09-12 12:41:07

+0

他问起某些lisboxitem – 2013-09-24 07:29:11

1

使用包裹在ScrollViewer中的ItemsControl。这会给你同样的效果,而选择(并且将允许您滚动就像一个列表框一样)

<ScrollViewer> 
    <ItemsControl> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     ... 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</ScrollViewer> 
相关问题