2010-10-29 113 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> 
相關問題