wpf 数据绑定2

可以将ItemsControl类控件的依赖项属性ItemsSource作为集合的绑定对象。那么如果集合实现了ObservableCollection<T>这个泛型接口,就能够在集合改变的时候界面也做出响应的改变。

ItemsSource = "{Binding}"                                    <--第一种表示方式在父级控件中设置了DataContext属性 !-->
ItemsSource = {Binding Source = {StaticResource XXXX}}       <--第二种表示方式使用资源的方式来显示数据XXXX为资源的Key !-->
<local:Persons x:Key="Persons"></local:Persons>DataContext = "{StaticResource Persons}"    如果不使用资源作为数据可在后台使用 control.DataContext = ...这样的表达式来定义DataContext<-- 后面的这个语句是将父级控件的DataContext属性赋值为资源 !-->

DataContext共享源

如果界面中的许多的元素都绑定到相同的一个源对象上,只是不同的属性。出于这个原因wpf可以指定一个隐式的数据源,而不用显示的标记每一个Source,ElementName,RelativeSource。

可以找到一个常见的父元素,并为它指定数据上下文。设置他的DataContext属性。那么在界面显示的时候如果绑定没有显式的源对象的时候。wpf会遍历逻辑树,直到找到一个非空的DataContext的时候为止。

 1 <StackPanel DataContext="{Binding Source={StaticResource Persons}}">
 2         <TextBlock Text="{Binding Path=Count}"></TextBlock>
 3         <Button Width="100" Click="Button_Click">Add</Button>
 4         <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}">
 5             <ListBox.ItemTemplate>
 6                 <DataTemplate>
 7                     <StackPanel>
 8                         <TextBlock Text="{Binding Path=Name}"></TextBlock>
 9                         <Image Width="40" Height="40" Source="F:\Loose XAML PhotoGallery\Creek.jpg"></Image>
10                     </StackPanel>
11                 </DataTemplate>
12             </ListBox.ItemTemplate>
13         </ListBox>
14 </StackPanel>

可以按照这样的方式来使用。另外如果要避免将数据源定义为资源可以使用   name.DataContext = .....这样的方式。

数据的呈现

我们可以按照我们想要的方式来显示数据,为了达到这个目的我们可以使用两种方式,一种是使用数据模版,一种是使用数据转换器。

1. 使用数据模版:

许多wpf的控件的属性可以添加数据模板,ContentControl控件的ContentTemplate属性,可以控制Content的呈现。ItemControl的ItemTemplate会被应用到每一个项。HeaderContentControl有一个HeaderTemplate属性可以控制Header的呈现等。

 5             <ListBox.ItemTemplate>
 6                 <DataTemplate>
 7                     <StackPanel>
 8                         <TextBlock Text="{Binding Path=Name}"></TextBlock>
 9                         <Image Width="40" Height="40" Source="F:\Loose XAML PhotoGallery\Creek.jpg"></Image>
10                     </StackPanel>
11                 </DataTemplate>
12             </ListBox.ItemTemplate>

正好一这样的方式来设置数据模版。

当然DataTemplate不需要被内联声明,他们通常被当当作一个资源。因此他们可以在多个元素间共享,无论这个属性在哪里,都可以让DataTemmplate对象自动被应用到指定的属性上。通过设置DataType属性为特定的类型就可以实现。

        <DataTemplate DataType="local:Person" x:Key="PersonTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Path=Name}"></TextBlock>
                <Image Width="40" Height="40" Source="F:\Loose XAML PhotoGallery\Creek.jpg"></Image>
            </StackPanel>
        </DataTemplate>
        <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" ItemTemplate="{StaticResource ResourceKey=PersonTemplate}">
        </ListBox>

2. 值转换器

值转换器能把源值转换为完全不同的目标值。他们可以用来插入自定义逻辑,但是不放弃数据绑定带来的好处。值转化器的目的就是实现在源和目标数据类型之间的转换。其实值转化器的使用也是分为两种情况的 1. 原值和目标值为兼容类型,只是想修改要显示的数据。 2. 原值和目标值是不兼容的,通过值转换器来实现原值的显示。

        <local:BackGroundConverter x:Key="backGroundConverter"></local:BackGroundConverter>  <-- 在资源中定义!-->
<TextBlock x:Name="Number" Background="{Binding ElementName=pictureBox,Path=Items.Count,Converter={StaticResource ResourceKey=backGroundConverter}, ConverterParameter=LightBlue}"></TextBlock>

上面展示的是值转换器的如何使用,值转换器的定义使用是要实现IValueConverter这个接口的

 1     public class ShowTextConverter : IValueConverter
 2     {
 3
 4         public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 5         {
 6             string showStr = "当前文件夹下的图片数:";
 7             int num = int.Parse(value.ToString());
 8             return (num == 1 || num == 0) ? showStr + num.ToString() + "Item" : showStr + num.ToString() + " Items";
 9         }
10
11         public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
12         {
13             throw new NotImplementedException();
14         }
15     }

// value        要转换的值
        // TargetType   要转化为的类型
        // parameter    在默认的情况下会被设置为null,
        // culture      使用美国英语作为默认值,en-US,尽管如此Binding还是可以通过Binding.ConverterParameter和Binding.ConverterCulture控制这两个值。

注意在上面的xaml语句中有ConverterParameter=LightBlue这个语句。默认情况下Paramter会被设置为null,但是使用这个句子酒水为转换方法传入parameter参数。

使用值转换器的另外一种情况是源和目标是兼容的,但是要根据情况定制显示

 1     public class ShowTextConverter : IValueConverter
 2     {
 3
 4         public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 5         {
 6             string showStr = "当前文件夹下的图片数:";
 7             int num = int.Parse(value.ToString());
 8             return (num == 1 || num == 0) ? showStr + num.ToString() + "Item" : showStr + num.ToString() + " Items";
 9         }
10
11         public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
12         {
13             throw new NotImplementedException();
14         }
15     }

时间: 2024-08-03 23:16:27

wpf 数据绑定2的相关文章

WPF 数据绑定 使用Code First with Database

一.准备工作 1.开发工具 Visual Studio 2013 2.安装Code First with Database 3.创建示例数据库 MyShop USE MyShop GO CREATE TABLE [dbo].[Categories] ( [CategoryId] [INT] NOT NULL IDENTITY , [Name] [NVARCHAR](MAX) , CONSTRAINT [PK_dbo.Categories] PRIMARY KEY ( [CategoryId] )

WPF 数据绑定基础

纯理论,可能会枯燥. .net 技术群: 199281001 ,欢迎加入. 1.目标对象一定是派生自DependencyObject的对象,并且目标属性必须是依赖属性,否则数据绑定操作将会失   败.绑定源对象可以不是依赖对象和依赖属性. 2.定义了依赖属性时,FrameworkPropertyMetadataOptions.NotDataBindable 标志会影响依赖属性的绑定.当改变源对象依赖属性值后,绑定目标可以立即得以更新,开发人员不需要响应事件来手动编写响应代码. 3.移除绑定:开发

WPF——数据绑定(一)什么是数据绑定

注意:本人初学WPF,文中可能有表达或者技术性问题,欢迎指正!谢谢! 一:什么是数据绑定? “Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简单而一致的方法来显示数据以及与数据交互. 元素能够以 公共语言运行时 (CLR) 对象 和 XML 形式绑定到来自各种数据源的数据.“ 这一段的解释来自于MSDN(貌似是机器翻译),我个人理解,数据绑定就是把我们需要操作的两个或多个对象的属性值相互关联的一种方便我们编程的技术. 二:一个绑定关系的四

WPF 10天修炼 第十天- WPF数据绑定

WPF数据绑定 数据绑定到元素属性是将源对象指定为一个WPF元素,并且源属性是一个依赖属性,依赖属性内置了变更通知.当改变源对象依赖属性值之后,绑定目标可以立即得到更新,开发人员不需要手动编写响应事件. 在绑定来源和绑定目标之间,可以使用Mode属性指定绑定的方法.Mode属性是System.Windows.Data.BindMode枚举类型的属性: OneWay:源数据变更目标数据变更,反之不行 OneTime:仅在启动时更新 OneWayToSource:目标数据更新源数据更新,反之不行 T

WPF——数据绑定及属性改变事件

一.首先需要封装一下文本框的属性,并且在实体类中添加一个实体类的属性改变函数 public class User : INotifyPropertyChanged //INotifyPropertyChanged接口是 WPF/Silverlight 开发中非常重要的接口, 它构成了 ViewModel 的基础, 数据绑定基本上都需要这个接口. { private string _Wenben; public string Wenben { get { return _Wenben; } set

wpf 数据绑定1

数据绑定实质上就是把一些任意的.net对象绑定到一起.那么绑定的源头就有1.绑定到目标对象的属性(通常为wpf元素)2.其他任何数据源 数据绑定的关键是System.Windows.Data.Binding类,他会把两个属性粘在一起,并在他们之间建立一条通信通道 Binding binding = new Binding(); //设置源对象 binding.Source = tree; //设置源属性 binding.Path = new PropertyPath("SelectedItem.

WPF数据绑定

一:控件到控件的绑定 1:OneWay Source影响着Target,但是Target却影响不到Source.2:OneWayToSource Target影响Source,而Source却影响不到Target.3:TwoWay Source与Target相互影响.4:OneTime 在OneWay的基础上延伸了一个OneTime,仅绑定一次.如果大家属性Jquery中的one函数我想就可以不用表述了. <Window x:Class="WpfApplication1.Window1&q

WPF 数据绑定,界面刷新的两种方法-----INotifyPropertyChanged

.Netformwork4.0及以下版本 -------INotifyPropertyChanged 命名空间: System.ComponentModel 后台代码 public partial class DvrWnd : UserControl { public DvrWnd() { InitializeComponent(); } private void InitInfo() { for (int i = 0; i < 10; i++) { DvrInfo dvrInfo = new

WPF——数据绑定(二)绑定方法—绑定本地对象

注意:本人初学WPF,文中表达或技术性问题请勿见怪,欢迎指正,谢谢 标记拓展语法:绑定到本地对象 什么是绑定到本地对象,我个人理解就是实现UI层上两个或多个控件的相互关联,一个控件的状态改变,导致另一个控件状态随机改变, 废话不多说,直接贴上代码,代码目的是实现一个TextBox和CheckBox的相互关联,选中CheckBox,则TextBox可用,否则不可用. <!--MainWindow.xaml--> <Window x:Class="Binding_1.MainWin