前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >win10 uwp listView 绑定前一项 WPF 绑定前一项UWP 绑定前一项

win10 uwp listView 绑定前一项 WPF 绑定前一项UWP 绑定前一项

作者头像
林德熙
发布2018-09-18 15:47:47
9320
发布2018-09-18 15:47:47
举报
文章被收录于专栏:林德熙的博客林德熙的博客

大神问,如何在 ListView 绑定前一项,于是我下面告诉大家如何在 ListView 绑定前一项

WPF 绑定前一项

可以使用绑定的 RelativeSource 就可以绑定前一项,请看代码

代码语言:javascript
复制
        <ListView >
            <ListViewItem>
                <ListViewItem.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}">
                                
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ListViewItem.Style>
            </ListViewItem>
        </ListView>

UWP 绑定前一项

如果需要在ListView 让每个项绑定前一个项的内容,那么就是本文要说的。

首先有一个数据的类,我新建一个 Foo

代码语言:javascript
复制
    public class Foo : INotifyPropertyChanged
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                OnPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

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

然后在界面做一个简单的列表,需要有两个TextBlock 一个绑定这一项的数据,一个绑定上一个项的数据

代码语言:javascript
复制
        <ListView ItemsSource="{Binding Foo}">
            <ListView.ItemTemplate>
                <DataTemplate DataType="local:Foo">
                   <Grid>
                      <TextBlock Text="{Binding Name}" ></TextBlock>
                       <TextBlock x:Name="上一个的" Margin="10,100,10,10" Text="" ></TextBlock>
                   </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

后台代码需要创建一个数据,但是这个数据我不会在运行添加

代码语言:javascript
复制
        public ObservableCollection<Foo> Foo { get; set; } = new ObservableCollection<Foo>()
        {
            new Foo()
            {
                Name = "lindexi"
            },
            new Foo
            {
                Name = "csdn"
            }
        };

这样看起来就是简单的代码,但是如果需要绑定上一项就需要添加一个新类

假如从后台拿到一个 TextBlock ,那么如何从这个 TextBlock 拿到这个的 DataContext ,可以获得他上一级的,虽然从这里拿到也可以

代码语言:javascript
复制
          var grid = (FrameworkElement) text.Parent;

            var foo = (Foo) grid.DataContext;

那么如何从 Grid 拿到ListView ,如果拿到这个就可以拿到绑定的数据,所以就可以从绑定的数据拿到当前的上一项,然后绑定。

如果需要从 Grid 拿到 ListView ,简单的代码是一个循环

代码语言:javascript
复制
   var temp = grid;
            while (!(temp is ListView))
            {
                temp = (FrameworkElement) VisualTreeHelper.GetParent(temp);
            }

这样就拿到了,那么拿到数据就可以绑定

代码语言:javascript
复制
           var foo2 = (IEnumerable<Foo>) ((ListView) temp).ItemsSource;

            var n = foo2.ToList();

            if (n.IndexOf(foo) > 0)
            {
                Binding bind = new Binding("Name")
                {
                    Source = n[n.IndexOf(foo) - 1],
                };
                BindingOperations.SetBinding(text, TextBlock.TextProperty, bind);
            };

一开始如何拿到 TextBlock ,可以使用一个附加属性来拿

代码语言:javascript
复制
       public static readonly DependencyProperty FooProperty = DependencyProperty.RegisterAttached(
            "Foo", typeof(object), typeof(Foo1), new PropertyMetadata(default(object), FooPropertyChangedCallback));

        public static void SetFoo(DependencyObject element, object value)
        {
            element.SetValue(FooProperty, value);
        }

        public static object GetFoo(DependencyObject element)
        {
            return (object) element.GetValue(FooProperty);
        }

                      <Grid>
                      <TextBlock Text="{Binding Name}" ></TextBlock>
                       <TextBlock x:Name="上一个的" Margin="10,100,10,10" Text="" local:Foo1.Foo="{Binding RelativeSource={RelativeSource Self}}"></TextBlock>
                   </Grid>

然后把代码写到 FooPropertyChangedCallback 就可以了

代码很简单,我就不写所有代码

代码:[免费]ListViewBindLastItem 1.0-CSDN下载


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • WPF 绑定前一项
  • UWP 绑定前一项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档