【UWP】FlipView绑定ItemsSource,Selectedindex的问题

最近在做列表头部的Carousel展示,Carousel使用的是FlipView展示,另外使用ListBox显示当前页,如下图

我们先设置一个绑定的数据源

    public class GlobalResource : INotifyPropertyChanged
    {
        private ObservableCollection<string> _items;
        public ObservableCollection<string> Items
        {
            get
            {
                return _items = _items ?? new ObservableCollection<string>
                {
                    Guid.NewGuid().ToString(),
                    Guid.NewGuid().ToString(),
                    Guid.NewGuid().ToString(),
                    Guid.NewGuid().ToString(),
                };
            }
            set
            {
                _items = value;
                OnPropertyChanged(nameof(Items));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Items作为数据源绑定在FlipView和ListBox上,布局代码如下

<Page x:Class="App1.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:local="using:App1"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d">

    <Page.Resources>
        <local:GlobalResource x:Key="GlobalResource" />
        <Style x:Key="DotListBoxItemStyle" TargetType="ListBoxItem">
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="TabNavigation" Value="Local" />
            <Setter Property="Padding" Value="12,11,12,13" />
            <Setter Property="HorizontalContentAlignment" Value="Left" />
            <Setter Property="Margin" Value="5" />
            <Setter Property="UseSystemFocusVisuals" Value="True" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Grid x:Name="LayoutRoot"
                              Background="{TemplateBinding Background}"
                              BorderThickness="{TemplateBinding BorderThickness}">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal" />
                                    <VisualState x:Name="Disabled" />
                                    <VisualState x:Name="PointerOver" />
                                    <VisualState x:Name="Pressed" />
                                    <VisualState x:Name="Selected">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="dotEllipse" Storyboard.TargetProperty="Fill">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="Blue" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="SelectedUnfocused">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="dotEllipse" Storyboard.TargetProperty="Fill">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="Blue" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="SelectedPointerOver">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="dotEllipse" Storyboard.TargetProperty="Fill">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="Blue" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="SelectedPressed">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="dotEllipse" Storyboard.TargetProperty="Fill">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="Blue" />
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Ellipse x:Name="dotEllipse"
                                     Width="10"
                                     Height="10"
                                     Control.IsTemplateFocusTarget="True"
                                     Fill="White" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <ListView>
            <ListView.Header>
                <Grid Height="200">
                    <FlipView x:Name="flipView" ItemsSource="{Binding Source={StaticResource GlobalResource}, Path=Items}">
                        <FlipView.ItemTemplate>
                            <DataTemplate>
                                <Rectangle Height="200"
                                           Margin="5,0"
                                           Fill="Red" />
                            </DataTemplate>
                        </FlipView.ItemTemplate>
                    </FlipView>

                    <ListBox x:Name="listBox"
                             Margin="0,0,0,8"
                             HorizontalAlignment="Center"
                             VerticalAlignment="Bottom"
                             Background="Transparent"
                             ItemContainerStyle="{StaticResource DotListBoxItemStyle}"
                             ItemsSource="{Binding Source={StaticResource GlobalResource},
                                                   Path=Items}"
                             SelectedIndex="{Binding ElementName=flipView,
                                                     Path=SelectedIndex,
                                                     Mode=TwoWay}">
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel HorizontalAlignment="Center" Orientation="Horizontal" />
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>

                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Ellipse Width="10"
                                         Height="10"
                                         Fill="White" />
                            </DataTemplate>
                        </ListBox.ItemTemplate>

                    </ListBox>
                </Grid>

            </ListView.Header>
            <Button Click="ButtonBase_OnClick">test</Button>
        </ListView>
    </Grid>
</Page>

MainPage.xaml

一切正常显示

下面我们需要修改数据源

    var globalResource = (GlobalResource) Resources["GlobalResource"];
    globalResource.Items.Clear();
    for (var i = 0; i < 10; i++)
    {
        globalResource.Items.Add(Guid.NewGuid().ToString());
    }

    Debug.WriteLine("flipView.SelectedIndex = {0}", flipView.SelectedIndex);
    Debug.WriteLine("listBox.SelectedIndex = {0}", listBox.SelectedIndex);

虽然数据源变了,但是并没有选中当前页(第一个点不为蓝色),通过输出信息发现SelectedIndex都是0,并没有改变

跟踪发现,调用ObservableCollection.Clear方法的时候SelectedIndex都被设为了-1,Add第一个的时候SelectedIndex被置为0,数据源和相关数据都改变了,不知道为什么样式没有出发(VisualState)由于不知道ListView内部实现,我们无法得知具体原因是啥

对于上面问题,可以通过下面方式解决

重新改变SelectedIndex让ListBox更新样式

    var globalResource = (GlobalResource) Resources["GlobalResource"];
    globalResource.Items.Clear();
    for (var i = 0; i < 10; i++)
    {
        globalResource.Items.Add(Guid.NewGuid().ToString());
    }

    flipView.SelectedIndex = -1;
    flipView.SelectedIndex = 0;

Demo:

  http://files.cnblogs.com/files/bomo/CarouselDemo.zip

时间: 2024-10-19 16:08:16

【UWP】FlipView绑定ItemsSource,Selectedindex的问题的相关文章

重新绑定ItemsSource先设置ItemsSource = null;的原因

即报错信息为:在使用 ItemsSource 之前,项集合必须为空. 原因:Items和ItemSource,只能有一个生效,想用其中一个,另一个必须是空. 重新绑定ItemSource,虽然绑定的集合对象Clear了,但是items还没有清空:然后再次绑定就会有问题. 所以要么设置ItemSource =null :要么 Items.Clear();

聊聊大麦网UWP版的首页顶部图片联动效果的实现方法

随着Windows10的发布,国内已经有越来越多的厂商上架了自家的通用应用程序客户端,比如QQ.微博.大麦等.所实话,他们设计的确实很好,很符合Windows10 的设计风格和产品理念,而对于开发者而言,当我们发现一个不错的UI设计风格不禁想自己动手也写一个类似的效果玩玩.前几天在微软的开发者社区中逛的时候,看见有人问大麦网的UWP版首页顶部是如何实现的,于是自己就好奇的安装了一下,想看看是什么效果.效果图如下所示: 小白们有没有感觉有一种高大上的感觉呢?(当然我也是一个小白啦!!!!大牛勿喷!

在WPF中使用变通方法实现枚举类型的XAML绑定

问题缘起 WPF的分层结构为编程带来了极大便利,XAML绑定是其最主要的特征.在使用绑定的过程中,大家都普遍的发现枚举成员的绑定是个问题.一般来说,枚举绑定多出现于与ComboBox配合的情况,此时我们希望实现的目标有: 建立选择项与ItemsSource的对应关系: 自动获取用于ItemsSource的枚举源: 自定义下拉框中显示的内容. 对于目标1,考虑最简单的模式,即枚举的定义采用从0开始的连续整数,可以使用IValueConverter接口来实现从枚举到整型的双向转换,以使得枚举成员绑定

ComboBox在WPF中的绑定示例:绑定项、集合、转换,及其源代码

在WPF的Xaml中为ComboBox绑定数据时,由于参数很多,很容易混淆,在ListView中使用更是如此.本文通过对ComboBox在窗口和在ListView中绑定对象的属性和属性可能是枚举类型的情况进行简单讲解和示例,以作实际应用参照. 源码可以到这里下载:ComboBoxBindings.rar 1.ComboBox在窗口容器中的情况 2.ComboBox在ListView中的情况 3.绑定枚举 示例中做枚举类型Sex的绑定时,先在Xaml中绑定值,然后在ComboBox的ItemsSo

UWP中新加的数据绑定方式x:Bind分析总结

UWP中新加的数据绑定方式x:Bind分析总结 0x00 UWP中的x:Bind 由之前有过WPF开发经验,所以在学习UWP的时候直接省略了XAML.数据绑定等几个看着十分眼熟的主题.学习过程中倒是也没遇到麻烦.直到在园子里看到了这篇文章: http://www.cnblogs.com/gaoshang212/p/4534138.html 原来UWP的绑定中新加了个x:Bind,从文章中可以看到x:Bind的效率是很高的.找到MSDN(数据绑定)看了一下(完整的学习目录可参见: http://w

wpf ListBox或ListView等数据控件 绑定数据,最简单的方式

在网上很难找最简单的案例,都是一大片,看着都头疼: 试试举一反三,如果把结果赋给DataContext这个属性,那就前台需要绑定ItemsSource="{Binding}",请注意.直接赋给ItemsSourc就不要绑定了: 后台代码: List<string> list = new List<string>(); for (int i = 0; i < 100; i++) { list.Add("sas" + i); } this.

FineUI(开源版)v4.1.5 和(专业版)v1.9.0 发布

FineUI(开源版) 基于 ExtJS 的开源 ASP.NET 控件库 FineUI的使命 创建 No JavaScript,No CSS,No UpdatePanel,No ViewState,No WebServices 的网站应用程序 支持的浏览器 IE 8.0+.Chrome.Firefox.Opera.Safari 授权协议 Apache License v2.0 注:ExtJS 库在 GPL v3 协议下发布(http://www.sencha.com/license) 相关链接

[Aaronyang] 写给自己的WPF4.5 笔记10[层次数据需求处理,TreeView绿色文章1/4]

 我的文章一定要做到对读者负责,否则就是失败的文章  ---------   www.ayjs.net    aaronyang技术分享 AY留言: 文章根据难易,我根据游戏的规则进行了分色,希望读者能选择自己的能力去读.白色<绿色<蓝色<紫色<橙色<红色 博文摘要: 简单的TreeView静态写法,了解展开事件,选中事件 关于磁盘驱动器的图标的获得,文件夹的图标的获得,文件的图标的获得,系统自己shell32.dll的图标的获得(例如我的电脑,回收站等icon) 关于Tre

WPF: 实现带全选复选框的列表控件

本文将说明如何创建一个带全选复选框的列表控件.其效果如下图:     这个控件是由一个复选框(CheckBox)与一个 ListView 组合而成.它的操作逻辑: 当选中“全选”时,列表中所有的项目都会被选中:反之,取消选中“全选”时,所有项都会被取消勾选. 在列表中选中部分数据项目时,“全选”框会呈现不确定状态(Indetermine). 由此看出,“全选”复选框与列表项中的复选框达到了双向控制的效果. 其设计思路:首先,创建自定义控件(CheckListView),在其 ControlTem