如何禁用Windows Phone 7中列表框项目中的触摸选择?

时间:2010-10-29 03:41:04

标签: windows-phone-7

在XAML模板中,我使用了一个列表框来填充一些动态数据。

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

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

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

希望一些聪明人可以教我如何解决问题。

感谢。

4 个答案:

答案 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 });

此示例中只有科幻电影可以点击。

希望有所帮助。