【发布时间】:2011-04-23 13:06:31
【问题描述】:
我有一个列表框,里面有几个项目。我想以编程方式将分隔栏插入列表框中。这可能吗?
MSDN 提到了 Separator 控件,但当我尝试实例化一个控件时,Visual Studio 无法识别它。
我正在使用 Silverlight 4。
【问题讨论】:
标签: c# silverlight
我有一个列表框,里面有几个项目。我想以编程方式将分隔栏插入列表框中。这可能吗?
MSDN 提到了 Separator 控件,但当我尝试实例化一个控件时,Visual Studio 无法识别它。
我正在使用 Silverlight 4。
【问题讨论】:
标签: c# silverlight
您所指的分隔符控件在 WPF 中,从我在文档中看到的内容在 Silverlight 中不受支持。
我会通过模板处理这个问题。使用项目的表示和分隔符的第二表示设置您的模板,然后将每个的可见性绑定到数据对象上的 IsSeparator 标志。
然后您需要做的就是创建一个虚拟对象,并将 IsSeparator 标志设置为 true,以获取列表中的新项目。
【讨论】:
见: http://manfredlange.blogspot.com/2009/04/separator-for-menu-item-in-xaml-wpf.html
我在 silverlight 4 中使用它,我只是从工具箱中拖放,它为我添加了对工具包的引用:
xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
我是这样使用的:
<toolkit:Separator Margin="15"/>
【讨论】:
我做了一个类似于 James 的修复。在绑定列表框的 TableModel 上添加一个布尔字段。
我对按类型分组的数据有额外要求,我将其留在下面的 LINQ 查询中。如果您不需要这个,您可以使用 allData.Count 代替 numDataTypes。我的布尔值被称为 IsLastItem 并填充了:
int numDataTypes = allData.Select(o => o.Type).Distinct().Count();
IEnumerable<TableModel> ByTypes = allData
.GroupBy(o => o.Type)
.Select((g, index) => new TableModel()
{
...
IsLastItem = index == (numDataTypes - 1),
});
然后在 ListBox(或 ItemsControl)中,我使用了布尔到可见性转换器(类似于此处发布的 Silverlight 4: how to switch control visibility):
<ItemsControl ItemsSource="{Binding ByTypes}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
...
<!-- Seperator between list items -->
<Rectangle Grid.Row="3" Height="20" Visibility="{Binding IsLastItem, Converter={StaticResource VisibileWhenFalseConverter}}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
【讨论】: