如何在Windows Phone 7中禁用listbox项目的触摸选择?

4
4个回答

10
你可以使用 ItemsControl 来替代 ListBox。ItemsControl 类似于 ListBox,但它不包含选择相关的内容。
<ItemsControl>
   <ItemsControl.ItemTemplate>
      <DataTemplate>
      ...
      </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>

完美地实现了我的目的(无需重新设计 ListBox)。 - Hutjepower
他询问了关于特定列表框项目的问题。 - eran otzap

1
使用在 ScrollViewer 中包装的 ItemsControl。 这将给您相同的效果,但没有选择(并且允许您像 ListBox 一样滚动)。
<ScrollViewer>
  <ItemsControl>
     <ItemsControl.ItemTemplate>
       <DataTemplate>
      ...
       </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</ScrollViewer>

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 Light作为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 });

在此示例中,只有科幻电影是可点击的。

希望有所帮助。


0

尝试使用变量来存储最后选择的索引。

如果用户选择了您不想处理选择事件的项目,则将所选索引设置回存储的值。如果您确实想要处理选择更改事件,请确保也更新您存储的值。

您可能还希望在手动设置索引(回)时避免触发选择更改。
可以使用简单的布尔标志来跟踪此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接