2015-08-14 101 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

相关问题