Silverlight WP7中带分组的水平拉伸列表项
我想在WP7上实现ListBox分组。我发现这很有用。事实上,我让分组成功了。但是我对ListItem水平拉伸有一个问题。我想我需要设置ItemContainerStyle并将HorizontalContentAlignment更改为Stretch。但是它在这种情况下不起作用(如果直接设置ItemTemplate,它会起作用)。有什么建议吗?非常感谢 下面是代码,ListItem应该是拉伸的,但它是居中的 C#:Silverlight WP7中带分组的水平拉伸列表项,silverlight,windows-phone-7,Silverlight,Windows Phone 7,我想在WP7上实现ListBox分组。我发现这很有用。事实上,我让分组成功了。但是我对ListItem水平拉伸有一个问题。我想我需要设置ItemContainerStyle并将HorizontalContentAlignment更改为Stretch。但是它在这种情况下不起作用(如果直接设置ItemTemplate,它会起作用)。有什么建议吗?非常感谢 下面是代码,ListItem应该是拉伸的,但它是居中的 C#: 公共类GroupingItemsControlConverter:IValueCo
公共类GroupingItemsControlConverter:IValueConverter
{
公共对象转换(对象值、类型tagetType、对象参数、CultureInfo区域性)
{
var valueAsIEnumerable=作为IEnumerable的值;
if(null==valueAsIEnumerable)
{
抛出新ArgumentException(“GroupingItemsControlConverter仅适用于IEnumerable输入。”,“值”);
}
var parameterAsGroupingItemsControlConverterParameter=作为GroupingItemsControlConverterParameters的参数;
if(null==参数GroupingItemsControlConverterParameter)
{
抛出新的ArgumentException(“缺少必需的GroupingItemsControlConverterParameter。”,“参数”);
}
var GroupSelectorAsGroupingItemsControlConverterSelector=参数GroupingItemsControlConverterParameter.GroupSelector作为IGroupingItemsControlConverterSelector;
if(null==GroupSelectorAsGroupingItemsControlConverterSelector)
{
抛出新ArgumentException(“GroupingItemsControlConverterParameter.GroupSelector必须为非null,并实现IGroutingItemsControlConverterSelector。”,“参数”);
}
//返回分组的结果
返回ConvertAndGroupSequence(值为Enumerable.Cast(),参数为GroupingItemsControlConverterParameter);
}
私有IEnumerable ConvertAndGroupSequence(IEnumerable sequence,GroupingItemsControlConverterParameters参数)
{
//验证参数
var groupKeySelector=((igroutingItemsControlConverterSelector)(parameters.GroupSelector)).GetGroupKeySelector();
var orderKeySelector=((IGroupingItemsControlConverterSelector)(parameters.GroupSelector)).GetOrderKeySelector();
if(null==groupKeySelector)
{
抛出新的NotSupportedException(“IGroupingItemsControlConverterSelector.GetGroupSelector必须返回非空值。”);
}
//进行分组和排序
var groupedOrderedSequence=sequence.GroupBy(groupKeySelector).OrderBy(orderKeySelector);
//返回包装的结果
foreach(groupedOrderedSequence中的var组)
{
返回新的ContentControl{Content=group.Key,ContentTemplate=parameters.GroupStyle};
foreach(组中的var项目)
{
返回新的ContentControl{Content=item,ContentTemplate=parameters.ItemStyle};
}
}
}
公共对象转换回(对象值、类型tagetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException(“GroupingItemsControlConverter不支持ConvertBack”);
}
}
公共类GroupingItemsControlConverterParameters
{
公共数据模板GroupStyle{get;set;}
公共数据模板ItemStyle{get;set;}
公共IGroupingItemsControlConverterSelector组选择器{get;set;}
};
公共抽象类IGroupingItemsControlConverterSelector
{
公共抽象函数GetGroupKeySelector();
公共虚拟函数GetOrderKeySelector(){return g=>g.Key;}
}
公共类GroupingItemsControlConverterSelector:IGroutingItemsControlConverterSelector
{
公共覆盖函数GetGroupKeySelector()
{
返回(o)=>(o作为ItemViewModel)。组;
}
}
XAML:
列表框分组?您应该考虑从中使用ListListS选择器。为了简化绑定,可以使用集合类型(有关详细信息,请查看) 然后,您可以简单地创建将值分组的应用程序,例如:
您是否尝试过将
HorizontalAlignment=“Stretch”
设置为组模板中的边框和项目模板中的网格?是的,我尝试过,Peter Torr提到过。两个都不起作用。我想我可以写一些C#代码来强制计算机将列表项宽度作为其父项,但还没有尝试过。嗨,谢谢你的回复。我已经研究了您的示例代码。似乎拉伸问题仍然存在。你有没有办法让GroupHeader在列表中伸展?谢谢正如您在原始问题中所说,修改与ItemContainerStyle等效的组件应该可以做到这一点。看起来我使用的是旧版本的toolkit,而新版本的toolkit解决了这个问题。谢谢你的帮助!您是否使用具有指定标题的LLS?在这种情况下,它不允许滚动到底部。
public class GroupingItemsControlConverter : IValueConverter
{
public object Convert(object value, Type tagetType, object parameter, CultureInfo culture)
{
var valueAsIEnumerable = value as IEnumerable;
if (null == valueAsIEnumerable)
{
throw new ArgumentException("GroupingItemsControlConverter works for only IEnumerable inputs.", "value");
}
var parameterAsGroupingItemsControlConverterParameter = parameter as GroupingItemsControlConverterParameters;
if (null == parameterAsGroupingItemsControlConverterParameter)
{
throw new ArgumentException("Missing required GroupingItemsControlConverterParameter.", "parameter");
}
var groupSelectorAsIGroupingItemsControlConverterSelector = parameterAsGroupingItemsControlConverterParameter.GroupSelector as IGroupingItemsControlConverterSelector;
if (null == groupSelectorAsIGroupingItemsControlConverterSelector)
{
throw new ArgumentException("GroupingItemsControlConverterParameter.GroupSelector must be non-null and implement IGroupingItemsControlConverterSelector.", "parameter");
}
// Return the grouped results
return ConvertAndGroupSequence(valueAsIEnumerable.Cast<object>(), parameterAsGroupingItemsControlConverterParameter);
}
private IEnumerable<object> ConvertAndGroupSequence(IEnumerable<object> sequence, GroupingItemsControlConverterParameters parameters)
{
// Validate parameters
var groupKeySelector = ((IGroupingItemsControlConverterSelector)(parameters.GroupSelector)).GetGroupKeySelector();
var orderKeySelector = ((IGroupingItemsControlConverterSelector)(parameters.GroupSelector)).GetOrderKeySelector();
if (null == groupKeySelector)
{
throw new NotSupportedException("IGroupingItemsControlConverterSelector.GetGroupSelector must return a non-null value.");
}
// Do the grouping and ordering
var groupedOrderedSequence = sequence.GroupBy(groupKeySelector).OrderBy(orderKeySelector);
// Return the wrapped results
foreach (var group in groupedOrderedSequence)
{
yield return new ContentControl { Content = group.Key, ContentTemplate = parameters.GroupStyle };
foreach (var item in group)
{
yield return new ContentControl { Content = item, ContentTemplate = parameters.ItemStyle };
}
}
}
public object ConvertBack(object value, Type tagetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException("GroupingItemsControlConverter does not support ConvertBack.");
}
}
public class GroupingItemsControlConverterParameters
{
public DataTemplate GroupStyle { get; set; }
public DataTemplate ItemStyle { get; set; }
public IGroupingItemsControlConverterSelector GroupSelector { get; set; }
};
public abstract class IGroupingItemsControlConverterSelector
{
public abstract Func<object, IComparable> GetGroupKeySelector();
public virtual Func<IGrouping<IComparable, object>, IComparable> GetOrderKeySelector() { return g => g.Key; }
}
public class GroupingItemsControlConverterSelector : IGroupingItemsControlConverterSelector
{
public override Func<object, IComparable> GetGroupKeySelector()
{
return (o) => (o as ItemViewModel).Group;
}
}
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.Resources>
<DataTemplate x:Key="GroupHeaderTemplate">
<Border BorderBrush="Yellow" BorderThickness="1" Margin="12,3,12,12" Padding="6" VerticalAlignment="Center">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Number}" HorizontalAlignment="Left" Margin="6,0,0,0" FontSize="22" Foreground="White"/>
<TextBlock Grid.Column="1" Text="{Binding Name}" HorizontalAlignment="Right" Margin="0,0,6,0" FontSize="22" Foreground="White"/>
</Grid>
</Border>
</DataTemplate>
<DataTemplate x:Key="CustomItemTemplate">
<Grid Margin="12,3,12,12" VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Text="{Binding Number}" HorizontalAlignment="Left" Margin="6,0,0,0" FontSize="22" Foreground="White"/>
<TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding Name}" HorizontalAlignment="Right" Margin="0,0,6,0" FontSize="22" Foreground="White"/>
</Grid>
</DataTemplate>
<local:GroupingItemsControlConverter x:Key="GroupingItemsConverter" />
<local:GroupingItemsControlConverterSelector x:Key="GroupingItemsSelector" />
<local:GroupingItemsControlConverterParameters x:Key="GroupingItemParameters"
GroupStyle="{StaticResource GroupHeaderTemplate}"
ItemStyle="{StaticResource CustomItemTemplate}"
GroupSelector="{StaticResource GroupingItemsSelector}"
/>
<Style TargetType="ListBoxItem" x:Key="CustomItemContainerStyle">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</Grid.Resources>
<ListBox x:Name="TheListBox"
ItemsSource="{Binding Items, Converter={StaticResource GroupingItemsConverter}, ConverterParameter={StaticResource GroupingItemParameters}}"
ItemContainerStyle="{StaticResource CustomItemContainerStyle}" />
</Grid>