WPF学习03:Element Binding我们可以实现控件属性与控件属性的绑定。

WPF学习07:MVVM 预备知识之数据绑定 我们可以实现控件属性与自定义对象属性的绑定。

而以上两个功能在实际应用中还是不够的,我们经常需要将列表数据与控件属性进行绑定。

例子

ListBox切换人物,下面两个文本框跟随切换,很常用的功能。

XAML代码:

<Window x:Class="DataTemplate.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" DisplayMemberPath="Name"/>
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
<TextBlock Text="性别:"></TextBlock>
<TextBlock Text="{Binding Gender}" Margin="0 0 100 0"></TextBlock>
<TextBlock Text="年龄:"></TextBlock>
<TextBlock Text="{Binding Age}" Margin="0 0 100 0"></TextBlock>
</StackPanel>
</StackPanel>
</Window>

后台代码:

public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void Notify(String propertyName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
} private Int32 age;
public Int32 Age
{
get { return age; }
set
{
age = value;
Notify("Age");
}
} private String gender;
public String Gender
{
get { return gender; }
set
{
gender = value;
Notify("Gender");
}
} private String name;
public String Name
{
get { return name; }
set
{
name = value;
Notify("Name");
}
}
} class People : List<Person>
{
public People()
{
this.Add(new Person() { Name = "John", Age = 30, Gender = "Male" });
this.Add(new Person() { Name = "Jake", Age = 26, Gender = "Male" });
this.Add(new Person() { Name = "Kate", Age = 25, Gender = "Female" });
}
} public MainWindow()
{
InitializeComponent();
DataContext = new People();
}

Collection View

将例子做一些改动:

仅仅是改动了XAML。删掉了原有的ListBox,增加了一个TextBlock与两个Button

<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
<TextBlock Text="姓名:"></TextBlock>
<TextBlock Text="{Binding Name}" Margin="0 0 100 0"></TextBlock>
<TextBlock Text="性别:"></TextBlock>
<TextBlock Text="{Binding Gender}" Margin="0 0 100 0"></TextBlock>
<TextBlock Text="年龄:"></TextBlock>
<TextBlock Text="{Binding Age}"></TextBlock>
</StackPanel>

数据绑定设置的路径为Name Gender Age 而当前的数据上下文却是个列表。在这种情况出现时,WPF会尝试当前数据列表的Current Item 视作绑定源。从而有了图片上的效果。

通过CollectionViewSource提供的GetDefaultView方法我们可以获得列表视图,列表视图可以使我们对列表进行包括但不限于改变Current Item的操作。

我们为两个按钮添加Handler,即可实现按钮切换人物的功能:

private void BtnToRight_Click(object sender, RoutedEventArgs e)
{
var view = CollectionViewSource.GetDefaultView(DataContext);
view.MoveCurrentToNext();
//越界,返回
if (view.IsCurrentAfterLast)
view.MoveCurrentToPrevious();
} private void BtnToLeft_Click(object sender, RoutedEventArgs e)
{
var view = CollectionViewSource.GetDefaultView(DataContext);
view.MoveCurrentToPrevious();
//越界,返回
if (view.IsCurrentBeforeFirst)
view.MoveCurrentToNext();
}

获取了列表视图后,我们还可以对数据列表进行过滤,排序等操作。在此略去例子。


IsSynchronizedWithCurrentItem

再回到文章最开始的例子中。之所以可以通过点击ListVox中的元素就能实现两个文字框内容的切换有两个原因:

1.他们的数据绑定,源相同(当前数据上下文)。

2.配置IsSynchronizedWithCurrentItem为 ture。

这样,ListControl可在SelectedItem切换时,自动切换当前绑定列表的CurrentItem。


DataTemplate简介

因为数据模板的东西太多,无法一次说完,在此先给出一个数据模板的例子。

通过数据模板,我们可以自由的定义数据的显示内容。

继续对本文开头的例子进行修改。首先要去掉该元素的DisplayMemberPath属性,该属性指定了绑定对象的哪一个属性做为Item的显示绑定对象。与数据模板功能冲突,故而去之。

改动后的效果:

改动后的XAML代码:

<Window x:Class="DataTemplate.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
<TextBlock Text="姓名:"></TextBlock>
<TextBlock Text="{Binding Name}" Margin="0 0 100 0"></TextBlock>
<TextBlock Text="性别:"></TextBlock>
<TextBlock Text="{Binding Gender}" Margin="0 0 100 0"></TextBlock>
<TextBlock Text="年龄:"></TextBlock>
<TextBlock Text="{Binding Age}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Window>

WPF学习09:数据绑定之 Binding to List Data的更多相关文章

  1. WPF学习之数据绑定

    WPF中的数据绑定提供了很强大的功能.与普通的WinForm程序相比,其绑定功能为我们提供了很多便利,例如Binding对象的自动通知/刷新,Converter,Validation Rules,Tw ...

  2. WPF学习03:Element Binding

    元素绑定是数据绑定的一个子集,关于数据绑定是什么,园子里有很多文章都说得非常好,在此不予详细说明. WPF实现了完善的数据绑定机制,使得元素绑定有简易的实现步骤. 本文的元素指的是WPF中的可视控件. ...

  3. [WPF系列]-DataBinding(数据绑定) 自定义Binding

    自定义Binding A base class for custom WPF binding markup extensions BindingDecoratorBase Code: public c ...

  4. WPF学习笔记 - 数据绑定(在代码中)

    在程序代码里,有两种设置绑定的方法,一种是调用FrameworkElement或FrameContentElement对象的SetBinding实例方法. 例如: Public MainWindow( ...

  5. WPF学习07:MVVM 预备知识之数据绑定

    MVVM是一种模式,而WPF的数据绑定机制是一种WPF内建的功能集,两者是不相关的. 但是,借助WPF各种内建功能集,如数据绑定.命令.数据模板,我们可以高效的在WPF上实现MVVM.因此,我们需要对 ...

  6. WPF学习10:基于MVVM Light 制作图形编辑工具(1)

    图形编辑器的功能如下图所示: 除了MVVM Light 框架是一个新东西之外,本文所涉及内容之前的WPF学习0-9基本都有相关介绍. 本节中,将搭建编辑器的界面,搭建MVVM Light 框架的使用环 ...

  7. WPF中的数据绑定

    WPF中的数据绑定 基础概念 System.Windows.Data.Binding,他会把两个对象(UI对象与UI对象之间,UI对象与.NET数据对象之间)按照指定的方式粘合在一起,并在他们之间建立 ...

  8. WPF学习(8)数据绑定

    说到数据绑定,其实这并不是一个新的玩意儿.了解asp.net的朋友都知道,在asp.net中已经用到了这个概念,例如Repeater等的数据绑定.那么,在WPF中的数据绑定相比较传统的asp.net中 ...

  9. WPF学习(8)数据绑定 https://www.cnblogs.com/jellochen/p/3541197.html

    说到数据绑定,其实这并不是一个新的玩意儿.了解asp.net的朋友都知道,在asp.net中已经用到了这个概念,例如Repeater等的数据绑定.那么,在WPF中的数据绑定相比较传统的asp.net中 ...

随机推荐

  1. VUE组件如何与iframe通信问题

    vue组件内嵌一个iframe,现在想要在iframe内获取父vue组件内信息,由于本人技术有限,采用的是H5新特性PostMessage来解决跨域问题. postMessage内涵两个API: on ...

  2. js的几种循环语句

    //js种的循环语句 //while与do while的区别是while是满足条件后才执行 //do while是不管满不满足条件都会执行一次 //for 循环与while,do while相比循环结 ...

  3. 3.2.1 配置构建Angular应用——简单的笔记存储应用——展示功能

    本节我们会通过构建一个简单的笔记存储应用(可以载入并修改一组简单的笔记)来学习如何应用Angular的特性.这个应用用到的特性有: 在JSON文件中存储笔记 展示.创建.修改和删除笔记 在笔记中使用M ...

  4. 【iOS系列】-textView的非常规使用

    [iOS系列]-textView的非常规使用 文本框坐标设置一点距离 //文本框,左边间距 textView.leftView = [[UIView alloc] initWithFrame:CGRe ...

  5. win10访问共享文件夹提示:引用的账户当前已锁定,且当前可能无法登陆

    最近一台电脑访问windows 2008 R2 server的共享文件夹.没有使用域环境. win10界面提示:引用的账户当前已锁定,且当前可能无法登陆. 登陆2008发现,该账户的确锁定.猜测可能该 ...

  6. 浅谈UML的概念和模型之UML视图

    相信大家都知道UML的全称,统一建模语言(UML是 Unified Modeling Language的缩写)是用来对软件系统进行可视化建模的一种语言.UML为面向对象开发系统的产品进行说明.可视化. ...

  7. Effective C++学习笔记(Part Four:Item 18-25)

     近期最终把effectvie C++细致的阅读了一边.非常惊叹C++的威力与魅力.近期会把近期的读书心得与读书笔记记于此,必备查找使用,假设总结有什么不 当之处,欢迎批评指正: 如今仅仅列出框架 ...

  8. ORACLE 创建视图索引序列

    /* 视图View 视图是从若干基本表和(或)其他视图构造出来的表 视图存放的都是查询语句,并没有真实的数据 虚表 作用 限制对数据的操作 复杂查询变简单 提供相同数据的不同显示 UNION ALL ...

  9. YTU 2559: “心脏出血”

    2559: "心脏出血" 时间限制: 1 Sec  内存限制: 128 MB 提交: 5  解决: 2 题目描述 2014年4月,一个开源加密库OpenSSL的严重漏洞" ...

  10. 【JSOI 2008】 最大数

    [题目链接] 点击打开链接 [算法] 很明显,我们可以用线段树解决此题 只需维护区间最值就可以了 [代码] #include<bits/stdc++.h> using namespace ...