绑定就是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是同时使用的,参考