在Windows Phone 8.1的ListView中,不显示Visibility=Collapsed的项目。
在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上不起作用。有什么建议我可以做什么?
代码:
....模板的其余部分不重要...
谢谢!
在Windows Phone 8.1中,ListView中的Collapsed ListViewItems会占用额外的空间。解决这个问题的方法是通过更改ItemContainerStyle为自定义样式(编辑默认样式的副本)并更改MinWidth
和MinHeight
的值。
具体操作如下:
1. 打开XAML页面中的ListView控件。
2. 找到ListView的ItemContainerStyle属性,并将其更改为自定义样式。
3. 创建自定义样式,可以通过编辑默认样式的副本来进行修改。
4. 在自定义样式中找到Setter
元素,并将其属性更改为MinWidth
和MinHeight
。
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就不会占用额外的空间了。
问题的原因:
在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
在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方法已经可以很好地解决问题了,所以暂时可以先使用这个方法。