我想在wpf中创建一个布局,它将显示父类Name,然后显示与父类关联的属性列表。我使用父作为根DataContext,然后将ItemsControl绑定到属性的子列表。
我希望显示类似于下面的内容,这样当换行时它将显示标题下的下一个属性" ParentName - "
ParentName - Attribute1,Attribute2,Attribute3 Attribute4,Attribute5和Attribute6
我的问题是我无法弄清楚如何制作" ParentName"与属性内联运行所以它总是出现以下行缩进以水平匹配第一个属性,而不是" ParentName - "我想要的组件。
有没有容器允许这样的东西?似乎所有可用的容器都像HTML块元素。我非常希望通过XAML来做这件事而不是代码。
<DataTemplate x:Key="ItemDisplay">
<WrapPanel Orientation="Horizontal" Grid.Column="3">
<TextBlock Text="{Binding Description}" VerticalAlignment="Bottom"/>
<ItemsControl Name="ToppingModificationsItemControl" ItemsSource="{Binding ItemAttributes}" VerticalAlignment="Bottom">
<ItemsControl.ItemTemplate>
<DataTemplate>
<WrapPanel Orientation="Horizontal">
<TextBlock Text="{Binding AttributeName}" VerticalAlignment="Bottom"/>
</WrapPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</WrapPanel>
</DataTemplate>
我不能包含我正在处理的实际代码,但我希望上面的例子能够说明我想要完成的任务。对于正在呈现的项目,您可以假定一个类具有Description属性和一个名为Item Attributes的属性中的字符串集合。
想看看
ItemDescription - Attribute1, Attribute2, Attribute3
Attribute4, Attribute5
不
ItemDescription - Attribute1, Attribute2, Attribute3
Attribute4, Attribute5
感谢。
答案 0 :(得分:0)
看起来你想得到2列。在这种情况下,我将使用网格或水平StackPanel替换外部WrapPanel。
答案 1 :(得分:0)
我认为你不能用基本的XAML做到这一点。
WPF面板类似于块状,我认为没有任何可以支持__|
形状的块,就像你想要的ItemsPanel
一样,它会包裹在顶部的另一个对象左角。
我只想使用IValueConverter
,并将数据对象转换为您想要的格式的字符串。
这样的事情:
<TextBlock Text="{Binding Converter={StaticResource MyObjectToDisplayValue}"
TextWrapping="Wrap" ... />
你的转换器做了这样的事情:
StringBuilder sb = new StringBuilder(val.Description);
if (val.Attributes != null && val.Attributes.Count > 0)
{
sb.Append(" - ");
foreach(var a in val.ItemAttributes)
sb.Append(a.AttributeName + ", ");
}
return sb.ToString().TrimEnd(", ");
当然,如果您可以将其作为数据对象的属性,那么它可能会更好,但如果它没有意义,那么Converter
可能是下一个最好的东西。
答案 2 :(得分:0)
我发现这个问题的解决方案是为两个集合创建一个单独的接口,然后绑定到一个属性,该属性将返回两个列表的结果。然后设置要按类型隐式选择的模板。通过仅执行单个绑定语句,我能够将所有内容放入单个包装面板中。