在Windows Phone 8.1 ListView

时间:2015-04-28 11:36:04

标签: windows-phone-8.1

我的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>

谢谢!

3 个答案:

答案 0 :(得分: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;
 }

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

我只想分享一下 - 未来可能对其他人有所帮助,

最好的问候, 斯蒂芬

答案 1 :(得分:0)

您可以尝试转换绑定到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;
    }
}

答案 2 :(得分:0)

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

,使用Collapsed ListViewItems的额外空格来解决此问题
<Setter Property="MinWidth" Value="{ThemeResource ListViewItemMinWidth}"/>
<Setter Property="MinHeight" Value="{ThemeResource ListViewItemMinHeight}"/>

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