Binding的使用梳理

本文详细介绍了WPF中数据绑定的基本概念,包括基础绑定、没有Path的绑定、DataContext的使用,以及链表式控件的绑定。还讨论了如何处理Source为复杂对象、RelativeSource绑定、数据校验和数据转换,并提供了相关的示例代码。
摘要由CSDN通过智能技术生成

1.Binding的基础概念
将Source的数据传递给Target,或者Target的数据传递给Source

2.Binding最简单的绑定
创建一个普通的Student类,包含一个Name属性,当作Source
让这个类继承INotifyPropertyChanged接口,实现该接口,即声明
一个PropertyChangedEventHandler事件

 public class Student:INotifyPropertyChanged {
   
        private string  name;

        public string Name
        {
   
            get {
    return name; }
            set {
    name = value;
                if (PropertyChanged!=null)
                {
   
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;`在这里插入代码片`
    }


事件信息参数为要修改的Name属性。
然后在XAML中声明一个TextBox与Button,TextBox作为Target,Button修改Source的Name。

可以在C#中做绑定

```csharp
this.text1.SetBinding(TextBox.TextProperty,new Binding("Name") {
    Source=stu});

也可以在XAML中做绑定,XAML语言是不能直接访问对象的,只能通过ElementName=sourceName,即通过设置ElementName,对象名字来访问对象

<TextBox x:Name="text1" Margin="5" Text="{Binding Path=Value,ElementName=slider1}"/>
<Slider x:Name="slider1" Margin="5" Maximum="100" Minimum="0" />

XAML中进行绑定最好是简单的绑定,只有Source Path 这种是比较合适的,当涉及到数据校验或者数据转换的时候,需要在C#的代码中实现较为合适。
可以看出的是XAML中进行Binding的方式是对某一属性使用扩展方法进行赋值,赋值的内容为"{Binding Path= , ElementName =,…}"

3.没有Path的绑定
Source本身就是一个值的时候,即Source为Path的时候可以省略掉Path

<StackPanel.Resources>
            <sys:String x:Key="myString">
                菩提本无树,明镜亦非台。
                本来无一物,何处惹尘埃。
            </sys:String>
        </StackPanel.Resources>
        <TextBlock x:Name="textBlock1" TextWrapping="Wrap" 
                   Text="{Binding Source={StaticResource ResourceKey=myString}}" FontSize="16" 
                   Margin="5"/>
    </StackPanel>

对应的C#绑定代码为
string mystring = “菩提本无树,明镜亦非台。本来无一物,何处惹尘埃。”;
this.textBlock1.SetBinding(TextBlock.TextProperty, new Binding(".") { Source = mystring });

4.作为Source的情况,当Source指定好之后,Path就可以比较简单的确认了,无论是Source本身还是其中的某一属性。
(1)普通的类(注意要实现INotifyPropertyChanged接口来通知binding数据更新),或者普通的控件都可以作为Source
(2)DataContext:所有的控件都有这个属性,当没有给这个属性赋值的时候,会根据UI树向上寻找有赋该值的控件,然后借用其值(依赖属性的定义)
先声明一个学生类

public class Student {
   
        public string Name {
    get; set; }
        public int Id {
    get; set; }
        public int Age {
    get; set; }
    }

注意不要声明字段,在XAML中为DatatContext中设置的时候读取不到字段。
XAML中设置TextBox与Student中类的属性进行绑定

<StackPanel Background="LightBlue">
        <StackPanel.DataContext>
            <local:Student Name="Tim" Age="28" Id="6"/>
        </StackPanel.DataContext>
        <Grid>
            <StackPanel>
                <TextBox Text="{Binding Path=Name}" Margin="5"/>
                <TextBox Text="{Binding Path=Id}" Margin="5"/>
                <TextBox Text="{Binding Path=Age}" Margin="5"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值