WPF 数据绑定

论坛 期权论坛 脚本     
匿名网站用户   2020-12-21 01:37   11   0

WPF中的数据绑定非常的灵活,使用起来也是十分的简单,这里我不扯什么理论知识了发个链接 想仔细研究的同学 可以自己去慢慢看

MSDNhttp://msdn.microsoft.com/zh-cn/library/ms752347(v=vs.100).aspx

本文主要是针对那些个想迅速了解数据绑定 直接上手的同学所写,废话不多说 上代码


<Window x:Class="DataBindingDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="700" Width="525">
    <StackPanel>
        <StackPanel Orientation="Horizontal" Margin="10" >
            <TextBlock  Text="Binding DependencyObject Property:" FontWeight="Bold"/>
            <TextBox x:Name="DP_Property" Text="test text" />
            <TextBlock Text="{Binding ElementName=DP_Property,Path=Text}" ToolTip="{Binding RelativeSource={RelativeSource self},Path=Text}"/>
        </StackPanel>

        <StackPanel Orientation="Horizontal" Margin="10" >
            <TextBlock Text="Binding CLR Object Property:" FontWeight="Bold"/>
            <TextBlock x:Name="TBSimpaleCLR" Text="{Binding ShowText}"/>
            <Button Width="70" Height="30" Content="auto update text" Click="AutoUpdateCLRProperty_Click"/>
        </StackPanel>
        <StackPanel  Margin="10" >
            <TextBlock Text="Binding CLR Object List:" FontWeight="Bold"/>
            <ItemsControl x:Name="IC_CLRList">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding ShowText}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
        <StackPanel  Margin="10" >
            <TextBlock Text="Binding CLR Object ObservableCollection:" FontWeight="Bold"/>
            <ItemsControl x:Name="IC_CLRListObservableCollection">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding ShowText}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <Button Content="Change data ui update" HorizontalAlignment="Left"
                    Width="120" Height="30" Click="ObservableCollectChange_Click"/>
        </StackPanel>

        <StackPanel Margin="10" >
            <TextBlock Text="Binding Linq Query" FontWeight="Bold"/>
            <ItemsControl x:Name="IC_LinqCLR">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding ShowText}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
        
        
        <StackPanel Margin="10" >
            <TextBlock Text="Binding XElement" FontWeight="Bold"/>
            <ItemsControl x:Name="IC_Linq2XML">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Attribute[name].Value}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
        

    </StackPanel>
</Window>


//code behind


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.Xml.Linq;

namespace DataBindingDemo
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        TestObject _clr;
        List<TestObject> _list = new List<TestObject>();
        ObservableCollection<TestObject> _observablelist = new ObservableCollection<TestObject>();
        XElement _linq2xml;
        public MainWindow()
        {
            InitializeComponent();
            InitData();

            //linq query find showtxt is not 1 in _list 
            var query = from i in this._list
                        where i.ShowText != "1"
                        select i;
            //binding datacontext in textblock
            this.TBSimpaleCLR.DataContext =this._clr ;
            //binding itemssource to clr list
            this.IC_CLRList.ItemsSource = this._list;
            //binding itemssource to linq query
            this.IC_LinqCLR.ItemsSource = query;
            //binding itemssource to xelement
            this.IC_Linq2XML.ItemsSource = _linq2xml.Elements("a");
            //binding itemssource to observablecollection
            this.IC_CLRListObservableCollection.ItemsSource = this._observablelist;
        }

        void InitData()
        {
            this._clr = new TestObject() { ShowText = "test clr object property" };
            _linq2xml = XElement.Parse("<list><a name='123' /><a name='456' /><a name='789' /></list>");

            this._list.Add(new TestObject() { ShowText = "1" });
            this._list.Add(new TestObject() { ShowText = "2" });
            this._list.Add(new TestObject() { ShowText = "3" });

            this._observablelist.Add(new TestObject() { ShowText = "1" });
            this._observablelist.Add(new TestObject() { ShowText = "2" });
            this._observablelist.Add(new TestObject() { ShowText = "3" });
            this._observablelist.Add(new TestObject() { ShowText = "4" });
        }


        private void AutoUpdateCLRProperty_Click(object sender, RoutedEventArgs e)
        {
            this._clr.ShowText = "updated text";
        }

        private void ObservableCollectChange_Click(object sender, RoutedEventArgs e)
        {
            this._observablelist.RemoveAt(0);
        }


    }

    public class TestObject : INotifyPropertyChanged
    {

        private string _showText;

        public string ShowText { get { return this._showText; } set { this._showText = value; OnPropertyChanged("ShowText"); } }
        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

    }

}


以上例子里面包含了基本上所有的数据绑定

包括依赖属性的绑定、clr属性绑定、clr对象List绑定、CLR对象的observableCollection的绑定、XML绑定、Linq Query的绑定下面具体说明


1.依赖属性的绑定

从例子里可以看出 我们可以通过Text="{Binding ElementName=DP_Property,Path=Text}" 我们可以将一个textblock的text字段与textbox的text字段绑定

ElementName是要绑定的数据源的name即textbox的名字

path是指绑定的属性名称这里我们绑定Text

这样 我们在修改textbox的内容的时候 textblock的内容也会自动改变

同理ToolTip="{Binding RelativeSource={RelativeSource self},Path=Text}" 将tooltip绑定了自身的text自动


2.CLR对象属性的绑定

在后台代码中this.TBSimpaleCLR.DataContext =this._clr ;就是将clr对象赋值给前台的空间的datacontext

这样前台的控件就有了数据对象了 在xaml中使用绑定<TextBlock x:Name="TBSimpaleCLR" Text="{Binding ShowText}"/>

就可以将控件的text属性绑定到clr对象的ShowText字段上了

这里要注意下 如果clr对象实现了INotifyPropertyChanged接口的话 只需要修改clr对象的ShowText字段 前台的ui也会自动更新

具体的请看代码中的TestObjectde 定义


3.在对一些列表类控件进行数据绑定 显示数据列表的时候 可以选择List 和ObservableCollection两种列表对象

不同之处在于使用List绑定控件的itemssource属性时候 如果更改了list内容 ui不会更新

而使用observablecollection对象绑定到itemssource的时候 如果列表更改了 ui也会随之更改

具体的可以看代码中的实例


4.linq query的绑定 实际上就是和3类似 没有什么特殊的地方 这里 不在赘述


5.XElement的绑定

只有一点需要大家注意的地方 那就是xaml中绑定的format

<TextBlock Text="{Binding Path=Attribute[name].Value}"/> 其中Attribute[name].Value 指的是绑定xml中名称为name的属性值

当然你也可以绑定xml中的值<TextBlock Text="{Binding Path=Value}"/> 这样就可以直接绑定xml中的节点值

<list>

<node name='123'>node1</node>

<node name='456'>node2</node>

</list>

如果绑定了list里面的node节点

那么<TextBlock Text="{Binding Path=Attribute[name].Value}"/>现实的就是123 456

<TextBlock Text="{Binding Path=Value}"/> 显示的就是node1 node2


当然 你也可以绑定ado的对象实际上我是不推荐这样直接绑定数据的 具体的例子也就不贴出来了 大家可以自己去试试

本文仅仅是针对绑定的使用做了简单的介绍 其中还有数据转换 数据验证 多值绑定等等很多内容 这里就不一一介绍了,也许以后有空了再写吧。




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP