我有一个列表框,它绑定到一个简单对象列表。我们知道列表框默认情况下它的项目主机作为Stackpanel,所以它以这种方式布局项目
item1
item2
item3
item4
item5
item6
但是我有一些条件可以检查项目是水平还是垂直显示,因此项目可以这种方式布局
例如: -
item1
item2
item3 item4 item 5
item6
怎么可能这样做?
(如果你想知道为什么我会需要这样的东西,一个示例场景将是“facebook样式更新”,如果用户连续上传3-4张照片,它们并不总是出现在下一行但它可能水平显示,而如果他发布一些事件,它会出现在下一行。)
提前致谢:)
答案 0 :(得分:4)
如果使用MVVM pattern,我会这样做:
ListItemViewModel
个实例的集合(请参阅下一点)您的视图看起来像这样,每个视图都有一个相应的ViewModel。
就像我上面所说,你肯定想要更改你的观点/视图模型的名称,我的仅用于演示目的:)
答案 1 :(得分:1)
解决方案的基本原理是在ItemsControl
的{{1}}中使用其他ItemTemplate
。此ListBox
应该具有水平导向ItemsControl
作为其StackPanel
。
这是一个基本的例子。让我们从一些非常简单的测试数据开始: -
ItemsPanel
现在我们要在ListBox中显示此列表,但保留在同一行上具有相同第一个首字母的所有名称。我将使用public class TestStringList : List<string>
{
public TestStringList()
{
AddRange(new[] {"Anthony", "Kar", "Martin", "Jon", "Erik", "Darin",
"Balus", "Mike", "Hans", "Alex", "Anomie", "David" });
}
}
的实现来处理我们需要的分组。如果您正在使用MVVM,那么您可以使用ViewModel。
IValueConverter
此转换器的输出基本上是public class Grouper : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return ((IEnumerable<string>)value).OrderBy(s => s).GroupBy(s => s[0]);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
,这正是我们想要的。外部ListBox将枚举外部集合,内部IEnumerable<IEnumerable<string>>
将枚举内部字符串集合,这些字符串将是具有相同初始值的一组名称。
这是xaml: -
ItemsControl