WindowsPhone8中LongListSelector的扩展解决其不能绑定SelectdeItem的问题

微软在Wp8中集成了LongListSelector, 但是该控件在ViewModel中不能实现的SelectdeItem双向绑定,因为其不是DependencyProperty没办法只能实现扩展!

1.实现LongListSelector的扩展ExtendedSelector

  public enum PositionOnAdd
    {
        Top,
        Default,
        NewItem
    }
    public class ExtendedSelector : LongListSelector
    {
        public static readonly DependencyProperty SelectedItemProperty =
            DependencyProperty.Register("SelectedItem", typeof(object), typeof(ExtendedSelector), new PropertyMetadata(default(object)));

        public static readonly DependencyProperty SelectionModeProperty =
            DependencyProperty.Register("SelectionMode", typeof(SelectionMode), typeof(ExtendedSelector), new PropertyMetadata(SelectionMode.Single));

        public static readonly DependencyProperty RepositionOnAddStyleProperty =
            DependencyProperty.Register("RepositionOnAddStyle", typeof(PositionOnAdd), typeof(ExtendedSelector), new PropertyMetadata(PositionOnAdd.Default));

        public PositionOnAdd RepositionOnAddStyle
        {
            get { return (PositionOnAdd)GetValue(RepositionOnAddStyleProperty); }
            set { SetValue(RepositionOnAddStyleProperty, value); }
        }

        public SelectionMode SelectionMode
        {
            get { return (SelectionMode)GetValue(SelectionModeProperty); }
            set { SetValue(SelectionModeProperty, value); }
        }

        public new object SelectedItem
        {
            get { return GetValue(SelectedItemProperty); }
            set { SetValue(SelectedItemProperty, value); }
        }

        public ExtendedSelector()
        {
            SelectionChanged += (sender, args) =>
            {
                if (SelectionMode == SelectionMode.Single)
                    SelectedItem = args.AddedItems[0];
                else if (SelectionMode == SelectionMode.Multiple)
                {
                    if (SelectedItem == null)
                    {
                        SelectedItem = new List<object>();
                    }

                    foreach (var item in args.AddedItems)
                    {
                        ((List<object>)SelectedItem).Add(item);
                    }

                    foreach (var removedItem in args.RemovedItems)
                    {
                        if (((List<object>)SelectedItem).Contains(removedItem))
                        {
                            ((List<object>)SelectedItem).Remove(removedItem);
                        }
                    }
                }
            };

            Loaded += (sender, args) =>
            {
                ((INotifyCollectionChanged)ItemsSource).CollectionChanged += (sender2, args2) =>
                {
                    if (ItemsSource.Count > 0 && args2.NewItems != null)
                    {
                        switch (RepositionOnAddStyle)
                        {
                            case PositionOnAdd.NewItem:
                                int index = ItemsSource.IndexOf(args2.NewItems[0]);

                                if (index >= 0)
                                    ScrollTo(ItemsSource[index]);
                                break;
                            case PositionOnAdd.Top:
                                ScrollTo(ItemsSource[0]);
                                break;
                        }
                    }
                };
            };
        }
    }

 2.在xmal中使用 扩展ExtendedSelector 

a.定义数据模板

   <DataTemplate x:Name="LLSDataTemplate">
        <ListBoxItem Margin="0,0,0,6">
            <StackPanel>
                <StackPanel Margin="0,0,0,12">
                    <TextBlock  toolkit:SlideInEffect.LineIndex="1"  Foreground="{StaticResource FontGroundThemeBrush}" TextWrapping="Wrap"   FontSize="30"  TextTrimming="None"   Text="{Binding name}"   />
                    <TextBlock  toolkit:SlideInEffect.LineIndex="2" Foreground="{StaticResource FontGroundThemeBrush}" Opacity="0.7" TextWrapping="Wrap" TextTrimming="None"  FontSize="18" Text="{Binding content}"  />
                </StackPanel>
            </StackPanel>
        </ListBoxItem>
    </DataTemplate>

  b.定义LongListSelector的Style

 <Style x:Key="JumpListStyle" TargetType="phone:LongListSelector">
        <Setter Property="GridCellSize"  Value="111,111"/>
        <Setter Property="LayoutMode" Value="Grid" />
        <Setter Property="Margin" Value="18,12,0,0"/>
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Border Background="{Binding Converter={StaticResource BackgroundConverter}}" Margin="6" >
                        <TextBlock Text="{Binding Key}"
                                       FontFamily="{StaticResource PhoneFontFamilySemiBold}"
                                       FontSize="48" Padding="11,0,0,1"
                                       Foreground="{Binding Converter={StaticResource ForegroundConverter}}" VerticalAlignment="Bottom" />
                    </Border>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <DataTemplate x:Key="GroupHeaderTemplate">
        <Border Background="Transparent" Padding="5">
            <Border Background="{StaticResource BackgroundThemeBrush}"
                    BorderBrush="{StaticResource BackgroundThemeBrush}"
                    Width="62" Height="62"
                    Margin="-6,0,18,6"
                    HorizontalAlignment="Left">
                <TextBlock Text="{Binding Key}"
                           Foreground="{StaticResource PhoneForegroundBrush}"
                           FontSize="48"
                           Padding="6,6,6,11"
                           FontFamily="{StaticResource PhoneFontFamilySemiLight}"
                           HorizontalAlignment="Left"
                           VerticalAlignment="Center"/>
            </Border>
        </Border>
    </DataTemplate>

  c.Page页面代码的实现

 <control:ExtendedSelector   Margin="12,0,12,24"   x:Name="ReaultListBox"
                                       ItemsSource="{Binding SearchReaultItem, Mode=TwoWay}"
                                       SelectedItem="{Binding SelectCydqItem,Mode=TwoWay}"
                                       GroupHeaderTemplate="{StaticResource GroupHeaderTemplate}"
                                       HideEmptyGroups="True"
                                       IsGroupingEnabled="True"
                                       ItemTemplate="{StaticResource LLSDataTemplate}"
                                       toolkit:TurnstileFeatherEffect.FeatheringIndex="1"
                                       JumpListStyle="{StaticResource JumpListStyle}"
                                       RepositionOnAddStyle="Top"  >
                                <i:Interaction.Triggers>
                                    <i:EventTrigger EventName="SelectionChanged">
                                    <cmd:EventToCommand Command="{Binding SearchVM.SelectionChangedCommand,Source={StaticResource Locator}}" CommandParameter="{Binding Path=SelectedItem,ElementName=ReaultListBox}"/>
                                    </i:EventTrigger>
                                </i:Interaction.Triggers>

                            </control:ExtendedSelector>

  

实现效果:

说明: RepositionOnAddStyle="Top" 有Top,Default,NewItem ,Top 为加载完数据后展示从头部开始 NewItem为加载完数据后展示从尾部开始
时间: 2024-11-12 10:52:26

WindowsPhone8中LongListSelector的扩展解决其不能绑定SelectdeItem的问题的相关文章

javascript中的数组扩展(一)

 javascript中的数组扩展(一) 随着学习的深入,发现需要学习的关于数组的内容也越来越多,后面将会慢慢归纳,有的是对前面的强化,有些则是关于前面的补充. 一.数组的本质    数组是按照次序排列的一组值,本质上,数组是一种特殊的对象            console.log(typeof[1,2,3]);//object    数组是对象但是对象不是数组            var arr = ['a','b','c','d','e'];            console.lo

PHP中获取文件扩展名的N种方法

PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法: function get_extension($file) { substr(strrchr($file, '.'), 1); } 第2种方法: function get_extension($file) { return substr($file, strrpos($file, '.')+1); } 第3种方法: function get_extension($file) { return end(expl

项目中遇到的扩展方法-总结和分享

概述: 本篇是对工作中遇到的扩展方法的总结,好记性不如乱笔头,先记下来,以后遇到类似问题,如果忘了,可以看下博客. 一.问题描述: 在项目中遇到一个问题,就是要将左边的代码替换为右边的代码,右边代码是对左边代码的封装,所以右边的代码更简便些. dataReader.IsDBNull(2) ? (string)null : dataReader.GetString(2).Trim(); dataReader.MyGetDataString(2); dataReader的类型是System.Data

EntityFramework中支持BulkInsert扩展

很显然,你应该不至于使用 EntityFramework 直接插入 10W 数据到数据库中,那可能得用上个几分钟.EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务. 但是,如果已经在项目中使用了 EntityFramework,如果碰到需要直接向数据库中插入 10W 的数据的需求,引入 ADO.NET 和 SqlBulkCopy 的组合将打破 EntityFramework 作为 ORM 所带来的优势,我们

Bash中的数学扩展

Bash只支持整数运算,不支持浮点运算.如果需要进行浮点运算,需要使用bc程序.Bash中的数学扩展有两种形式:$[ expression ]或$(( expression )) 例子:$echo $[5+4-2]7 $echo $[ 5*(6-2) ]20 var1=100var2=50var3=45var4=$((var1*(var2-var3))) #注意:圆括号里不需要加$了,和数学运算一样,推荐用这种方式$echo $var4 也可以使用程序/usr/bin/expr来进行整数运算$e

项目记录:spring+springmvc 项目中 @Transactional 失效的解决方法

第一步,修改spring的配置文件和springmvc的配置文件 --------------------------------applicationContext.xml <context:annotation-config/>  <context:component-scan base-package="com.xxx"> <context:exclude-filter type="annotation" expression=&

android ListView中CheckBox错位的解决

貌似已经很晚了,但是还是想记下笔记,想让今天完满. 在ListView中加了checkBox,可是发现点击改变其选中状态的时候,发现其位置错乱.状态改变的并不是你选中的,百思不得其解.后面通过上网查资料,可是个说纷纭,但是我还是找到了解决办法. 在自定义的适配器中,对checkBox的设置如下: 记住两者的顺序,先对checkBox进行事件监听,再设置其状态.前提在布局中对checkBox的状态设为false. android ListView中CheckBox错位的解决,布布扣,bubuko.

WCF中的错误及解决办法

一 .    HTTP 无法注册 URL http://+:8000/Users/.进程不具有此命名空间的访问权限今天按照网上的例子开始学习WCF程序,运行的时候却发现出如下问题:HTTP 无法注册 URL http://+:8000/Users/.进程不具有此命名空间的访问权限. 遇到这种问题,先不要慌,看一下错误内容:进程不具备此命名空间的访问权限,说明是访问权限的问题,所以我试着以管理员的身份重新打开了VS,结果就没报这个错 WCF中的错误及解决办法,布布扣,bubuko.com

CUDA程序编译过程中产生警告的解决方法

有时候经常使用别人用Tabhost+其它的实现demo.单纯利用Tabhost该如何使用呢? 下面看例子: public class MainActivity extends TabActivity { public TabHost tabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获取对象 tabHost = getTabH