WPF-绑定-《五》

绑定就是Binding,是控件和数据之间交互的类。

source = {binding} 

和 

source = {binding RelativeSource={RelativeSource self},Path=DataContext}

效果相同。

例如:直接绑定数据源

前台xaml界面

    <Grid>
        <StackPanel Orientation="Vertical">
            <TextBlock Text="{Binding Number}" Width="50" Height="30" Background="WhiteSmoke" Foreground="Black"/>
            <TextBlock Text="{Binding Name}" Width="50" Height="30" Background="WhiteSmoke" Foreground="Black"/>
            <TextBlock Text="{Binding Class}" Width="50" Height="30" Background="WhiteSmoke" Foreground="Black"/>
        </StackPanel>
 </Grid>

后台界面

    public partial class MainWindow : Window
    {
        public class StudentInfo
        {
            public int Number { get; set; }
            public string Name { get; set; }
            public string Class { get; set; }
        }
        public MainWindow()
        {
            InitializeComponent();
            List<StudentInfo> list = new List<StudentInfo>();
            for (int i = 0; i < 10; i++)
            {
                StudentInfo entity1 = new StudentInfo();
                entity1.Number = i;
                entity1.Name = "其他" + i;
                entity1.Class = "其他" + i + "其他";
                list.Add(entity1);
            }
            this.DataContext = list;
        }
    }

这里最重要的是this.DataContext = list; 不同的时候DataContext 是不一样的

其中RelativeSource有4种模式:

1.RelativeSource Mode=Self,绑定自身的值。

2.RelativeSource Mode=PreviousData,么看懂,反正就是最后一行数据少了(***),图如下

3.TemplatedParent模式,绑定一个模板。

4.FindAncestor模式,绑定特定的类型。

绑定有三种,Binding,PriorityBinding,MultiBinding。

第一种,Binding,单个值绑定

2个控件一旦进行绑定,那么2个控件是相互的,你变化,我也跟着变化。

1.当绑定写在第一个控件上

<StackPanel>
            <Slider x:Name="s" Value="{Binding ElementName=t, Path=Text}"></Slider>
            <TextBox x:Name="t" Text="0"></TextBox>

            <!--<Slider x:Name="s" Value="0"></Slider>
            <TextBox x:Name="t" Text="{Binding ElementName=s, Path=Value,UpdateSourceTrigger=PropertyChanged}"></TextBox>-->
        </StackPanel>

效果

2.当绑定写在第二个控件上

 <StackPanel>
            <!--<Slider x:Name="s" Value="{Binding ElementName=t, Path=Text}"></Slider>
            <TextBox x:Name="t" Text="0"></TextBox>-->

            <Slider x:Name="s" Value="0"></Slider>
            <TextBox x:Name="t" Text="{Binding ElementName=s, Path=Value,UpdateSourceTrigger=PropertyChanged}"></TextBox>
        </StackPanel>

效果

在第二个控件上面要写上UpdateSourceTrigger=PropertyChanged,如果不写,输入数据,滑动块就不会变化,它的意思就是,根据属性而变化。

Mode,

可以选择模式,进行控制

分别是默认

依次是

第二种,PriorityBinding

使用场景:比如一个TextBlock值,加载的时候有3种变化,那么可以使用这个办法,按照耗时的时间进行显示值,类似在上面覆盖2个TextBlock。

界面

界面代码

<Window x:Class="Dispatcher.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Dispatcher" xmlns:collection="clr-namespace:System.Collections;assembly=mscorlib" xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:AsyncDataSource x:Key="AsyncDS" SlowestDP="最慢" SlowerDP="慢" FastDP="快"  />
    </Window.Resources>
    <Grid>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" DataContext="{Binding Source={StaticResource AsyncDS}}">
            <TextBlock FontSize="18" FontWeight="Bold" Margin="10" HorizontalAlignment="Center">Priority Binding</TextBlock>
            <TextBlock Background="Honeydew" Width="100" HorizontalAlignment="Center">
                <TextBlock.Text>
                    <PriorityBinding FallbackValue="defaultvalue">
                        <Binding Path="SlowestDP" IsAsync="True"/>
                        <Binding Path="SlowerDP" IsAsync="True"/>
                        <Binding Path="FastDP" />
                    </PriorityBinding>
                </TextBlock.Text>
            </TextBlock>
        </StackPanel>
    </Grid>
</Window>

cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Dispatcher
{
    public class AsyncDataSource
    {
        private string _fastDP;
        private string _slowerDP;
        private string _slowestDP;

        public AsyncDataSource()
        {
        }

        public string FastDP
        {
            get { return _fastDP; }
            set { _fastDP = value; }
        }

        public string SlowerDP
        {
            get
            {
                Thread.Sleep(3000); //模拟耗时
                return _slowerDP;
            }
            set { _slowerDP = value; }
        }

        public string SlowestDP
        {
            get
            {
                Thread.Sleep(5000); //模拟耗时
                return _slowestDP;
            }
            set { _slowestDP = value; }
        }
    }
}

第三种,MultiBinding

顾名思义,就是绑定多个值,但是一般来说,绑定多个值和多值转换IMultiValueConverter是同时使用的,参考

WPF-值转换《九》_故里2130的博客-CSDN博客_ivalueconverter wpf

来源:WPF-绑定-《五》_wpf self_故里2130的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故里2130

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值