WindowsPhone开发随记:数据绑定中元素的模板选择器

在WindowsPhone开发之中,数据绑定的存在可以极大的简化并分离界面层和逻辑层。

尤其是集合绑定(绑定在ListBox这种列表控件中),不需要非常多的冗余代码就可以实现批量类似数据的显示。

往往数据不仅繁多,并且表现的形式或许也不尽相同,单一的表现格式往往无法满足功能需求。

例如一个新闻列表(如下图所示),有的元素为标题,有的新闻元素带有图片,有的新闻则没有,但共同显示在一个ListBox中,这种情况在应用当中非常常见。

对应这种情况,往往就需要模板选择器(DataTemplateSelector) 来实现这个功能。

 

我在这个页面中,创建了三种类型模板,分别为:SubTitle(副标题),Contents(纯文本),ImageContents(图片+文本),对应不同的对象元素需求。

根据元素对象中type的属性,来判断使用哪种模板。

    public abstract class DataTemplateSelector : ContentControl
    {
        public virtual DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            return null;
        }

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

            ContentTemplate = SelectTemplate(newContent, this);
        }
    }

    public class ListTemplateSelector : DataTemplateSelector
    {
        public DataTemplate SubTitle { get; set; }

        public DataTemplate ImageContents { get; set; }

        public DataTemplate Contents { get; set; }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            NewsListInfo listInfo = item as NewsListInfo;
            if (listInfo != null)
            {
                if (listInfo.type == "SubTitle")
                {
                    return SubTitle;
                }
                else if (listInfo.type == "ImageContents")
                {
                    return ImageContents;
                }
                else
                {
                    return Contents;
                }
            }

            return base.SelectTemplate(item, container);
        }
    }


XAML中的实现

        <ListBox Name="listBox" Margin="0,0,0,0" ItemsSource="{Binding}" MouseMove="ListBox_MouseMove_1">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <local:ListTemplateSelector Content="{Binding}">

                        <!-- 子标题模板 -->
                        <local:ListTemplateSelector.SubTitle>
                            <DataTemplate>
                               省略
                            </DataTemplate>
                        </local:ListTemplateSelector.SubTitle>

                        <!-- 内容模板(带图片)-->
                        <local:ListTemplateSelector.ImageContents>
                            <DataTemplate>
                               省略
                            </DataTemplate>
                        </local:ListTemplateSelector.ImageContents>

                        <!-- 内容模板(不带图片)-->
                        <local:ListTemplateSelector.Contents>
                            <DataTemplate>
                               省略
                            </DataTemplate>
                        </local:ListTemplateSelector.Contents>
                        
                    </local:ListTemplateSelector>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>


 这样就实现了上图中的效果。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值