一、绑定到元素
1.元素绑定
<StackPanel> <Slider Name="slider" Width="300" Value="10" Minimum="0" Maximum="30" TickFrequency="1" IsSnapToTickEnabled ="True" TickPlacement="TopLeft"></Slider> <Label Name="lable" FontSize="{Binding ElementName=slider,Path=Value}">hello</Label> </StackPanel>
元素绑定 使用{Binding ElementName= ,Path= }
这种方式比valueChanged事件要简单
2.绑定模式
数据绑定的一个特性是目标会被自动更新,而不考虑元的修改方式
<Button Name="btn" Click="btn_Click" Width="80" Height="30"/>
private void btn_Click(object sender, RoutedEventArgs e) { slider.Value = 28; }
*注意:如果在绑定了元素的情况下对lable进行字体设置
private void btn_Click(object sender, RoutedEventArgs e) { lable.FontSize = 28; }
这将会使元素绑定失效,怎么滑动lable都不会再发生变化
解决办法,可以通过双向绑定的方式进行绑定
<Label Name="lable" FontSize="{Binding ElementName=slider,Path=Value,Mode=TwoWay}">hello</Label>
Mode的值
OneWay 当源属性变化时更新目标属性
TwoWay 双向更新
OneWayToSource 在目标属性更改时,更新源属性
OneTime 仅当应用程序启动时或 DataContext 进行更改时更新目标属性???
Default 默认以上方式中的一种
3.使用代码绑定
Binding binding = new Binding(); binding.Source = slider; binding.Path = new PropertyPath("Value"); binding.Mode = BindingMode.TwoWay; lable.SetBinding(Label.FontSizeProperty, binding);
取消绑定
private void btn_Click(object sender, RoutedEventArgs e) { BindingOperations.ClearAllBindings(lable); }
一般使用xaml的方式绑定,但当创建动态绑定或删除绑定时需要用代码的方式。
4.代码检索绑定
private void btn_Click(object sender, RoutedEventArgs e) { Binding binding = BindingOperations.GetBinding(lable, Label.FontSizeProperty); MessageBox.Show(binding.Source.ToString() + " 2:" + binding.Path.ToString() + " 3: "+binding.Mode.ToString()); }
5.多绑定
6.更新绑定
反向从目标到源的改变不一定会立即发生,
Binding binding = new Binding(); binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
或者
<Label Name="lable" FontSize="{Binding ElementName=slider,Path=Value,Mode=OneTime,UpdateSourceTrigger=PropertyChanged}">hello</Label>
- PropertyChanged 每当绑定目标属性发生更改时,都会更新绑定源
- LostFocus 每当绑定目标元素失去焦点时,都会更新绑定源
- Explicit 仅在调用 UpdateSource() 方法时更新绑定源
- Default 绑定目标属性的默认 UpdateSourceTrigger 值。 大多数依赖属性的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus
7.延迟绑定
避免频繁操作,延迟500毫秒
<Label Name="lable" FontSize="{Binding ElementName=slider,Path=Value,Mode=OneTime,Delay=500}">hello</Label>