在Windows Phone 8.1的ListView中,不显示Visibility=Collapsed的项目。

16 浏览
0 Comments

在Windows Phone 8.1的ListView中,不显示Visibility=Collapsed的项目。

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

我的问题几乎与此处所述的问题相同:在Windows 8.1 GridView中不显示Visibility=Collapsed的项目

唯一让我困扰的是,链接问题的提问者说对他来说在Windows Phone上工作正常,但在Windows上不工作。对我来说,在Windows Phone上不起作用。有什么建议我可以做什么?

代码:

    
        
            
                
                
            
             ....模板的其余部分不重要...
        
    

谢谢!

0
0 Comments

在Windows Phone 8.1中,ListView中的Collapsed ListViewItems会占用额外的空间。解决这个问题的方法是通过更改ItemContainerStyle为自定义样式(编辑默认样式的副本)并更改MinWidthMinHeight的值。

具体操作如下:

1. 打开XAML页面中的ListView控件。

2. 找到ListView的ItemContainerStyle属性,并将其更改为自定义样式。

3. 创建自定义样式,可以通过编辑默认样式的副本来进行修改。

4. 在自定义样式中找到Setter元素,并将其属性更改为MinWidthMinHeight

5. 将MinWidth的值更改为"0",将MinHeight的值更改为"0"。

以下是代码示例:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="MinWidth" Value="0"/>
            <Setter Property="MinHeight" Value="0"/>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

通过以上操作,ListView中的Collapsed ListViewItems就不会占用额外的空间了。

0
0 Comments

问题的原因:

在Windows Phone 8.1的ListView中,当设置了Visibility为Collapsed的项时,该项仍然会在容器样式中保留一个占位符。

解决方法:

通过以下代码,可以实现在Windows Phone 8.1的ListView中隐藏Visibility为Collapsed的项:

// Key_Up事件处理函数
foreach (YourType element in TheListViewZoomedIn.Items)
{
    if (!element.YourProperty.Contains(ListSearchBox.Text))
        (TheListViewZoomedIn.ContainerFromItem(element) as ListViewItem).Visibility = Visibility.Collapsed;
}

需要注意的是,这种方法可能不够优雅,对于大型列表可能不太可行,但它可以完成任务并提供大量的控制。只需确保在需要的地方重新设置Visibility。

希望这个解决方法能够帮助到其他人,祝好!

Stefan

0
0 Comments

在Windows Phone 8.1中,ListView中设置了Visibility为Collapsed的项不会显示出来。以下是解决这个问题的原因和解决方法。

原因:ListView在绑定ItemsSource时,不会自动过滤掉Visibility为Collapsed的项。

解决方法:可以使用Converter来手动过滤掉Visibility为Collapsed的项。具体做法如下。

首先,在XAML中使用Converter:

<ListView

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

然后,在Converter中实现过滤逻辑:

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,可以对Converter进行修改,如下:

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;
    }
}

还有一个解决方法是在ViewModel中处理这个问题,但是上述的Converter方法已经可以很好地解决问题了,所以暂时可以先使用这个方法。

0