使用多个ItemTemplates时,并非所有ListView项都被拉伸

时间:2016-04-29 15:07:26

标签: c# xaml listview windows-phone-8.1

我正在使用Windows Phone 8.1应用,我需要根据项目的状态显示两个不同的项目模板。

要在我的模板之间切换,请使用某些博客上建议的TemplateSelector抽象类或其他内容。这是代码:

public abstract class TemplateSelector : ContentControl
{
    public abstract DataTemplate SelectTemplate(object item, DependencyObject container);

    protected override void OnContentChanged(object oldContent, object newContent)
    {
        base.OnContentChanged(oldContent, newContent);

        ContentTemplate = SelectTemplate(newContent, (DependencyObject)this);
    }
}

之后我创建了一个继承的类:

public class LibraryItemTemplateSelector : TemplateSelector
{
    public DataTemplate Expanded
    {
        get;
        set;
    }

    public DataTemplate Collapsed
    {
        get;
        set;
    }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var v = ApplicationData.Current.LocalSettings.Values;
        var ffs = item as FFStory;
        if (ffs != null)
        {
            if (v.ContainsKey("alwaysExpanded"))
            {
                if ((bool)v["alwaysExpanded"] == true)
                    return Expanded;
            }
            var result = ...
            ...
            if (result == 1)
                return Collapsed;
            else return Expanded;
        }
        return null;
    }
}

接下来,我在XAML中的<ItemTemplate><DataTewmplate>标签内使用了类名称,以便为项目分配模板:

<local:LibraryItemTemplateSelector Content="{Binding}" Expanded="{StaticResource expandedItem}" Collapsed="{StaticResource collapsedItem}" HorizontalAlignment="Stretch" />

问题:

当我启动应用时,所有项目的宽度似乎是随机的。

展开的商品都是全宽的,但这是可以理解的。设置WrapText=WrapWholeWords的描述文本块只会拉出框。

倒塌的物品,hovewer,似乎没有按照任何规则运作。许多项目的宽度与标题TextBlock的宽度相同,但有些项目的长度约为30 px。有时候正常工作的全宽项目,但这似乎是随机的。

我也尝试过单独使用这些模板,没有LibraryItemTemplateSelector类,而且效果很好。

Conslusions:

我认为TemplateSelector抽象类存在问题,因为没有它,一切正常,但我无法确切地说出错误。

我已将HorizontalContentAlignment设置为ItemContainerStyle中的拉伸,我还在绝望中尽可能添加了HorizontalAlignment="Stretch"属性。毋庸置疑,这不起作用。

我在这里做错了什么?上面的抽象类是否有问题,或者ItemTemplate不应该以这种方式工作?

谢谢!

1 个答案:

答案 0 :(得分:0)

试试DataTemplateSelector的代码:

    public class ProfilePageTemplateSelector : DataTemplateSelector
    {
        public DataTemplate dtPostTemplate { get; set; }
        public DataTemplate dtCommentTemplate { get; set; }

        protected override DataTemplate SelectTemplateCore( object item, DependencyObject container )
        {
            var uiElement = container as UIElement;
            if ( uiElement == null )
            {
                return base.SelectTemplate( item, container );
            }

            if ( item is Post )
            {
                return dtPostTemplate;
            }
            else if ( item is Comment )
            {
                return dtCommentTemplate;
            }
            return base.SelectTemplateCore( item, container );
        }