Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight WP7中带分组的水平拉伸列表项_Silverlight_Windows Phone 7 - Fatal编程技术网

Silverlight WP7中带分组的水平拉伸列表项

Silverlight WP7中带分组的水平拉伸列表项,silverlight,windows-phone-7,Silverlight,Windows Phone 7,我想在WP7上实现ListBox分组。我发现这很有用。事实上,我让分组成功了。但是我对ListItem水平拉伸有一个问题。我想我需要设置ItemContainerStyle并将HorizontalContentAlignment更改为Stretch。但是它在这种情况下不起作用(如果直接设置ItemTemplate,它会起作用)。有什么建议吗?非常感谢 下面是代码,ListItem应该是拉伸的,但它是居中的 C#: 公共类GroupingItemsControlConverter:IValueCo

我想在WP7上实现ListBox分组。我发现这很有用。事实上,我让分组成功了。但是我对ListItem水平拉伸有一个问题。我想我需要设置ItemContainerStyle并将HorizontalContentAlignment更改为Stretch。但是它在这种情况下不起作用(如果直接设置ItemTemplate,它会起作用)。有什么建议吗?非常感谢

下面是代码,ListItem应该是拉伸的,但它是居中的

C#:

公共类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>