WPF的数据绑定详细介绍(2)

问题:绑定源的值是在您编辑文本的同时进行更新,还是在您结束编辑文本并将鼠标指针从文本框移走后才进行更新呢?或者在您需要更新的情况下在手动的更新呢?

1. UpdateSourceTrigger 属性是确定触发源更新的原因。

下图中右箭头的点演示 UpdateSourceTrigger 属性的角色:

TwoWay及OneWayToSource是由绑定目标到绑定源方向,若实现绑定目标的值更改影响绑定源的值方式,只需要设置相应控件绑定时的UpdateSourceTrigger的值,其值有三种:

PropertyChanged:当绑定目标属性更改时,立即更新绑定源。

LostFocus:当绑定目标元素失去焦点时,更新绑定源。

Explicit:仅在调用 UpdateSource 方法时更新绑定源。

注释:多数依赖项属性的UpdateSourceTrigger 值的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus。

2. 示例

复制代码 代码如下:


XAML:


<Page x:Class="WpfDemo.Changed"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Changed">

<Grid Background="Silver">

<Grid.RowDefinitions>

<RowDefinition></RowDefinition>

<RowDefinition></RowDefinition>

<RowDefinition></RowDefinition>

<RowDefinition></RowDefinition>

</Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition></ColumnDefinition>

<ColumnDefinition></ColumnDefinition>

<ColumnDefinition></ColumnDefinition>

</Grid.ColumnDefinitions>

<TextBlock Grid.Row="0" Grid.Column="0" Text="PropertyChanged:"></TextBlock>

<TextBlock Grid.Row="1"  Grid.Column="0" Text="LostFocus:"></TextBlock>

<TextBlock Grid.Row="2"  Grid.Column="0" Text="Explicit:"></TextBlock>

<TextBox Grid.Row="0" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  Grid.Column="1" />

<TextBox Grid.Row="1" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=LostFocus}"   Grid.Column="1"  />

<TextBox Grid.Row="2" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=Explicit}"   Grid.Column="1"  />

<TextBlock Grid.Row="3"  Grid.Column="0" Text="结果:"></TextBlock>

<TextBlock Grid.Row="3"  Grid.Column="1" Text="{Binding Path=UserName,Mode=OneWay}"></TextBlock>

<Button Grid.Row="3" Grid.Column="2">Explicit</Button>

</Grid>

</Page>


复制代码 代码如下:


C#:


namespace WpfDemo

{

public partial class Changed : Page

{

#region properties

public UserModel CurrentUser

{

get;set;

}

#endregion

#region Constructor

public Changed()

{

InitializeComponent();

this.Loaded += new RoutedEventHandler(Changed_Loaded);

this.btnChanged.Click += new RoutedEventHandler(btnChanged_Click);

}

#endregion

#region Changed_Loaded

void Changed_Loaded(object sender, RoutedEventArgs e)

{

this.CurrentUser = new UserModel() {UserName="swd"};

this.DataContext = this.CurrentUser;

}

#endregion

#region btnLogon_Click

void btnChanged_Click(object sender, RoutedEventArgs e)

{

this.txtExplicit.GetBindingExpression(TextBox.TextProperty).UpdateSource();

}

#endregion

}

public class UserModel

{

public string UserName

{

get;set;}

}

}


程序执行结果如上所述。


四、      数据提供程序

1. XmlDataProvider:

XmlDataProvider访问 XML 数据的方式有以下三种:

可以使用 XmlDataProvider 类嵌入内联 XML 数据。

可以将 Source 属性设置为 XML 数据文件的 Uri。

可以将 Document 属性设置为 XmlDocument。

注释:当 XmlDocument.NodeChanged 事件发生时,XmlDataProvider 执行所有绑定的完全刷新。 特定节点不进行优化。

默认情况下,XmlDataProvider.IsAsynchronous 属性设置为 true,表示默认情况下 XmlDataProvider 检索数据并异步生成 XML 节点的集合。

以下将介绍使用上面所述的三种方式显示xml数据:

示例

复制代码 代码如下:


Xaml:


<Page x:Class="WpfDemo.xmlBinding"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="xmlBinding" xmlns:local="clr-namespace:WpfDemo">

<Page.Resources>

<XmlDataProvider x:Key="XmlFile" Source="Students.xml" XPath="/Students"></XmlDataProvider>

<XmlDataProvider x:Key="InnerXmlStu" XPath="/Students">

<x:XData>

<Students xmlns="">

<Student><name>swd</name></Student>

<Student><name>awd</name></Student>

<Student><name>asd</name></Student>

</Students>

</x:XData>

</XmlDataProvider>

</Page.Resources>

<Grid>

<Grid.RowDefinitions>

<RowDefinition></RowDefinition>

<RowDefinition></RowDefinition>

<RowDefinition></RowDefinition>

</Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition></ColumnDefinition>

<ColumnDefinition></ColumnDefinition>

</Grid.ColumnDefinitions>

<TextBlock Grid.Row="0" Grid.Column="0"   Text="引用XML文件"></TextBlock>

<TextBlock Grid.Row="1" Grid.Column="0"   Text="内嵌XML"></TextBlock>

<TextBlock Grid.Row="2" Grid.Column="0"   Text="动态XML"></TextBlock>

<ListBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding Source={StaticResource XmlFile},XPath=Student/name}">

</ListBox>

<ListBox Grid.Row="1" Grid.Column="1"  ItemsSource="{Binding Source={StaticResource InnerXmlStu},XPath=Student/name}">

</ListBox>

<ListBox Grid.Row="2" Grid.Column="1"   ItemsSource="{Binding XPath=Student/name}">

</ListBox>

</Grid>

</Page>


复制代码 代码如下:


XML:


<?xml version="1.0" encoding="utf-8" ?>

<Students>

<Student>

<name>swd</name>

<score>110</score>

</Student>

<Student>

<name>asd</name>

<score>120</score>

</Student>

<Student>

<name>awd</name>

<score>130</score>

</Student>

</Students>


通过以上示例我想大家应该很容易理解与应用。


2. ObjectDataProvider:

ObjectDataProvider 使您能够在 XAML 中创建可用作绑定源的对象,并为您提供以下属性,以对对象执行查询并绑定到结果。

使用 ConstructorParameters 属性将参数传递给对象的构造函数。

使用 MethodName 属性调用一个方法。

使用 MethodParameters 属性将参数传递给该方法。 然后,可以绑定到该方法的结果。

使用ObjectType 指定将提供数据绑定源的对象。

使用 ObjectInstance 属性来指定现有的对象实例作为源

注释:还可以使用 IsAsynchronous 属性指定是在辅助线程还是在活动上下文中执行对象创建。也就是是否异步检索数据。

示例:

复制代码 代码如下:


XAML:

C#:


namespace WpfDemo

{

#region CObjectDataProvider

public partial class CObjectDataProvider : Page

{

public CObjectDataProvider()

{InitializeComponent();}

}

#endregion

#region Country

public class Country

{

#region Name

public string Name

{get;set;}

#endregion

#region ProvinceList

public List<Province> ProvinceList

{get;set;}

#endregion

#region GetAllCity

public static List<Country> GetAllCity()

{

return new List<Country>{

new Country

{

Name = "中国",

ProvinceList = new List<Province>

{

new Province{,

CityList=new List<City>{new City{Name="福州市"},new City{Name="厦门市"},new City{Name="漳州市"},new City{Name="泉州市"}}

},

new Province{Name="江苏省",

CityList=new List<City>{

new City{Name="苏州市"},new City{Name="南京市"},new City{Name="扬州市"},new City{Name="无锡市"}}

},

new Province{Name="江西省",

CityList=new List<City>{new City{Name="南昌市"},new City{Name="九江市"}}}}

}

};

}

#endregion

}

#endregion

#region Province

public class Province

{

#region Name

public string Name

{get;set;}

#endregion

#region CityList

public List<City> CityList

{get;set;}

#endregion

}

#endregion

#region City

public class City

{

#region Name

public string Name

{get;set;}

#endregion

}

#endregion

}


五、类型转换与数据校验

1. IValueConverter接口

提供一种将自定义逻辑应用于绑定的方式。

在Binding时,数据源对象到目标对象之间(或者目标对象到数据源对象)可能需要某种转换。这时只需实现IValueConverter接口自定义值转换器即可。

接口原型定义:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjdwjg.html