2015-08-14 104 views
1

如果我有一組綁定到我的GridView的項目,並且每個項目都有一個屬性IsSelected,我如何確保選擇GridViewItem的狀態?在GridView中設置選定的項目

我試過綁定ItemContainerStyle中的屬性,但沒有運氣。

我覺得最好使用ItemTemplateSelector嗎?也許我會嘗試,而我等待任何反饋。

回答

2

這一直是一個痛苦由於缺乏支持Value的結合量的StyleSetterWinRT中,但應該是一個解決方法,它已經適應了的WinRT(它最初目標在Silverlight 4相同的限制 - PS:Slverlight 5支持Setters-綁定),您可以檢查它here

但即便如此,由於某些原因this也不會工作的WinRT

<GridView SelectionMode="Multiple" HorizontalAlignment="Stretch"> 
    <GridView .ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="IsSelected" Value="True"/> 
     </Style> 
    </GridView .ItemContainerStyle> 

現在,除非你找到一個更好的解決辦法,在這裏一點點黑客從here靈感看起來不那麼幹淨,但它做的伎倆

  • 擴展的GridView類

    using Windows.UI.Xaml; 
    using Windows.UI.Xaml.Controls; 
    using Windows.UI.Xaml.Controls.Primitives; 
    using Windows.UI.Xaml.Data; 
    public class GridViewEx : GridView 
    { 
        protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item) 
        { 
         base.PrepareContainerForItemOverride(element, item); 
         var gridItem = element as GridViewItem; 
         var binding = new Binding { Mode = BindingMode.TwoWay, Source = item, Path = new PropertyPath("IsSelected") }; 
         gridItem.SetBinding(SelectorItem.IsSelectedProperty, binding); 
        } 
    } 
    
  • 確保IsSelected屬性存在於您的GridViewItemSource集合

    public class Item 
    { 
        public String Name { get; set; } 
        public bool IsSelected { get; set; }   
    } 
    // .. 
    public ObservableCollection<Item> ListItems 
    { 
        get 
        { 
         return _listItems; 
        } 
    
        set 
        { 
         if (_listItems == value) 
         { 
          return; 
         } 
    
         _listItems = value; 
         OnPropertyChanged(); 
        } 
    } 
    
  • ,你是好去

    <local:GridViewEx SelectionMode="Multiple" ItemsSource="{Binding ListItems}" > 
         <local:GridViewEx.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding Name}"></TextBlock> 
          </StackPanel> 
         </DataTemplate> 
        </local:GridViewEx.ItemTemplate> 
    </local:GridViewEx> 
    
+1

我們需要做的所有這些由於缺乏祖先的結合。我在這裏創建了一個API請求(https://wpdev.uservoice.com/forums/110705-universal-windows-platform/suggestions/9333168-ancestor-binding-missing)。如果感興趣,請點贊。 –

+1

有一個缺陷,如果你滾動列表,選擇消失。不知道爲什麼/發生了什麼。 – earthling

+0

@earthling由於UI虛擬化而發生。虛擬化的UI可能會重用容器並打破綁定。 – akshay2000

相關問題