【问题标题】:Not showing items with Visibility=Collapsed in Windows Phone 8.1 ListView在 Windows Phone 8.1 ListView 中不显示 Visibility=Collapsed 的项目
【发布时间】:2015-07-07 05:47:39
【问题描述】:

我的 ListView 有问题。我将 ItemsSource 绑定到我的 ViewModel,但我希望将某个属性设置为 null 的项目完全折叠(因为整个项目都折叠了,而不仅仅是绑定了可能为 null 的属性的控件)。我有一个可以工作的转换器,但 ListView 似乎仍然为折叠的项目保留了至少一些空间。这导致我的 ListView 有丑陋的“漏洞”。 (请注意,这些孔不占用可见项目那么多的空间,但它们确实占用了一些空间,并且“不可见”项目甚至可以点击......)

我的问题和这里所说的差不多:Not showing items with Visibility=Collapsed in Windows 8.1 GridView

唯一困扰我的是链接问题的 OP 说,对他来说,它在 Windows Phone 中运行良好,但在 Windows 中却不行。对我来说,它在 Windows Phone 中不起作用。有什么建议吗?

代码:

    <DataTemplate x:Key="UpcomingEpisodesTemplate">
        <Grid Visibility="{Binding Upcoming, Converter={StaticResource EpisodeVisibilityConverter}}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="110"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
             ....The rest of the template which is not important...
        </Grid>
    </DataTemplate>

谢谢!

【问题讨论】:

    标签: windows-phone-8.1


    【解决方案1】:

    我已经搜索了 2 天来折叠没有容器样式中剩余占位符的项目,这似乎有效(WinRT 8.1)。

    (Key_Up Event from TextBox)
    
    foreach (YourType element in TheListViewZoomedIn.Items)
    {
        if (!element.YourProperty.Contains(ListSearchBox.Text))
            (TheListViewZoomedIn.ContainerFromItem(element) as ListViewItem).Visibility = Visibility.Collapsed;
     }
    

    对于大型列表来说,它可能不是超级优雅或可行,但它可以完成工作并提供大量控制。只需确保在需要的位置再次设置可见性即可。

    我只是想分享这个 - 它可能会在未来帮助其他人,

    最好的问候, 斯蒂芬

    【讨论】:

      【解决方案2】:

      您可以尝试将您绑定的任何内容转换为 ItemsSource。像这样:

      <ListView
          ItemsSource={Binding MyList, Converter={StaticResource MyListConverter}}>
      

      有了这样的转换器。

      public class MyListConverter : IValueConverter
      {
          public object Convert(object value, Type targetType, object parameter, string language)
          {
              return ((IEnumerable<MyType>)value).Where(x => x.MyProperty != null);
          }
      
          public object ConvertBack(object value, Type targetType, object parameter, string language)
          {
              return null;
          }
      }
      

      使用 ObservableCollection 进行编辑。

      public class MyListConverter : IValueConverter
      {
          public object Convert(object value, Type targetType, object parameter, string language)
          {
              var originalObservable = (ObservableCollection<MyType>)value;
      
              var collection = new ObservableCollection<MyType>();
      
              collection.AddRange(originalObservable.Where(x => x.MyProperty != null));
      
              originalObservable.CollectionChanged += delegate { collection.Clear(); collection.AddRange(originalObservable.Where(x => x.MyProperty != null)); };
      
              return collection;
          }
      
          public object ConvertBack(object value, Type targetType, object parameter, string language)
          {
              return null;
          }
      }
      

      【讨论】:

      • 多么巧妙的小技巧,没想到...非常感谢!我在该解决方案/解决方法中看到的唯一问题是,如果实际的 ObservableCollection(ListView 绑定到的)以任何方式更改(即添加/删除项目等),则不会调用转换器。我编写了一个方法,将 ItemsSource 设置为 null,然后再次设置 ObservableCollection 以强制再次调用转换器。
      • 这样视图会正确刷新。知道如何以“更清洁”的方式实现相同的行为吗?
      • 嗯,你可以在转换器中返回新的 ObservableCollection 并观察原始集合(存储在“值”中)CollectionChanged 的​​变化,并更新返回的集合。
      • 是的,抱歉,AddRange 在 ObservableCollection 中不可用,您可以使用 foreach 和 .Add,但是这个解决方案有点奇怪,也许这一切都可以在 ViewModel 中完成。
      • 嗯,转换器工作得很好,所以我想我就这样离开它吧……我的刷新解决方法不是最好的解决方案,但现在还可以; )
      【解决方案3】:

      如果有帮助,您可以通过将 ItemContainerStyle 更改为您的自定义样式(编辑默认样式的副本)并更改:-

      <Setter Property="MinWidth" Value="{ThemeResource ListViewItemMinWidth}"/>
      <Setter Property="MinHeight" Value="{ThemeResource ListViewItemMinHeight}"/>
      

      <Setter Property="MinWidth" Value="0"/>
      <Setter Property="MinHeight" Value="0"/>
      

      【讨论】:

        猜你喜欢
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多