【问题标题】:Setting selected items in a GridView在 GridView 中设置所选项目
【发布时间】:2015-11-08 07:06:58
【问题描述】:

如果我有一个绑定到我的 GridView 的项目集合,并且每个项目都有一个属性 IsSelected,我如何确保该 GridViewItem 的状态被选中?

我尝试在 ItemContainerStyle 中绑定该属性,但没有成功。

您认为我最好使用 ItemTemplateSelector 吗?也许我会在等待任何反馈时尝试一下。

【问题讨论】:

    标签: xaml windows-8.1 win-universal-app uwp


    【解决方案1】:

    由于 Winrt 中的StyleSetter 中缺乏对Value 绑定的支持,这一直很痛苦,但是有一个解决方法,已经适配winrt(原来针对Silverlight 4的相同限制-ps:Slverlight 5 support binding in Setters-),可以查看here

    但即便如此,由于某种原因,thisWinrt 中也不起作用:

    <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 属性存在于您的 GridView ItemSource 集合中

      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>
      

    【讨论】:

    • 由于缺乏祖先绑定,我们必须做所有这些。我在这里创建了一个 API 请求 (wpdev.uservoice.com/forums/110705-universal-windows-platform/…)。有兴趣请点赞。
    • 这里有一个缺陷,如果你滚动列表,选择就会消失。还不确定为什么/发生了什么。
    • @earthling 它是由于 UI 虚拟化而发生的。虚拟化 UI 可能会重用容器并破坏绑定。
    猜你喜欢
    • 2016-07-09
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多