博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF---数据绑定(一)
阅读量:5290 次
发布时间:2019-06-14

本文共 9028 字,大约阅读时间需要 30 分钟。

一、何为数据绑定

场景:考虑一个Window上有一个TextBox和一个Slider两个元素,当我拖动滑动条的时候,会在TextBox中显示当前滑动条的数值;当我们在TextBox中输入一个有效值,滑动条

中的滑块会滑到TextBox中输入的值所对应的位置。

定义:数据绑定可以理解为两个对象之间的一种关联,对象中的某个属性总是保持同步于另个对象的某个属性值。我们可以形象的把绑定比作一个桥梁,它负责同步桥头两侧的物体。

保持同步的数据元素必须是属性,一个叫源属性,一个叫目标属性;

目标属性必须是一个依赖属性。

二、如何绑定元素对象

关于上面滑动条和文本框的绑定,我们可以用以下Xaml代码实现:

等价的后台代码实现如下:

using System.Windows;using System.Windows.Controls;using System.Windows.Data;namespace BindingDemo1{    ///     /// Interaction logic for MainWindow.xaml    ///     public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();           // Binding binding = new Binding() { ElementName = "sldrSlider",Path= new PropertyPath("Value")};            Binding binding = new Binding("Value") { ElementName = "sldrSlider" };            tbx.SetBinding(TextBox.TextProperty, binding);        }    }}

后台代码主要完成了以下功能:

 1)创建一个binding对象;

 2)设置了binding对象的Source和Path值;

 3)调用了目标(textbox)的SetBinding方法创建一个binding表达式,它连接了binding对象和目标依赖属性。

三、数据绑定的方向

我们可以通过设置Binding对象Mode属性控制数据绑定的方向

OneWay:数据源改变时,更新目标;

TwoWay:双向更新;

OneWayToSource:目标改变时,更新数据源;

OneTime:只更新目标一次,使用数据源的初值,以后目标不再被更新;

Default:使用目标的默认绑定模式。

四、触发器---更新数据源的时机

仍然考虑上面滑动条和文本框的绑定关系,我们会发现当文本框的数值改变后,滑动条的滑块不会立即改变,而是在文本框失去焦点的时候,才会改变。

这就涉及到当目标属性变化的时候,数据源如何以及何时变化。

关于数据的更新方向和时机,可以参见下图:

当目标依赖属性发生变化,我们可以利用Binding对象的UpdateSourceTrigger属性来控制何时更新数据源,UpdateSourceTrigger属性值包括以下:

注:UpdateSourceTrigger属性值不影响目标的更新方式,它仅仅控制TwoWay模式或OneWayToSource模式的绑定更新源的方式。

而文本框正是使用LostFocus方式从目标向源进行更新的。

如果要完全控制源对象的更新时机,则可以选择UpdateSourceTrigger.Explicit模式

此时就需要额外编写代码手动触发更新。可以添加一个Apply按钮,并在按钮的Click事件处理程序中调用方法立即更新数据源。

参考代码以下:

1 
9
10
11
12
13
14
15
16
View Code
1 using System.Windows; 2 using System.Windows.Controls; 3 using System.Windows.Data; 4  5 namespace BindingDemo1 6 { 7     ///  8     /// Interaction logic for MainWindow.xaml 9     /// 10     public partial class MainWindow : Window11     {12         public MainWindow()13         {14             InitializeComponent();15            //Binding binding = new Binding() { ElementName = "sldrSlider",Path= new PropertyPath("Value")};16            //Binding binding = new Binding("Value") { ElementName = "sldrSlider" ,UpdateSourceTrigger=UpdateSourceTrigger.};17            //tbx.SetBinding(TextBox.TextProperty, binding);18         }19 20         private void Button_Click(object sender, RoutedEventArgs e)21         {22             //获得应用于文本框上的绑定23             BindingExpression be = tbx.GetBindingExpression(TextBox.TextProperty);24             //调用UpdateSource更新源对象25             be.UpdateSource();26         }27     }28 }
View Code

 五、转换器

上面的例子中,当拖动滑动条的时候,文本框中显示的数字会显示好多位小数,现在我们想让在文本框中只显示两位小数,这时候就需要转换器来实现了。

定义:转化器是一个类,用于拦截数据源和目标之间的数据,拦截之后,就可以按照我们的意愿对数据进行操作。

转换器包括单值转换器多值转换器。单值转换器需要实现IValueConverter接口,多值转换器需要实现IMultiValueConverter接口。

对于上面的需求,我们可以使用单值转换器,参考代码如下:

1 using System; 2 using System.Globalization; 3 using System.Windows; 4 using System.Windows.Controls; 5 using System.Windows.Data; 6  7 namespace BindingDemo1 8 { 9     /// 10     /// Interaction logic for MainWindow.xaml11     /// 12     public partial class MainWindow : Window13     {14         public MainWindow()15         {16             InitializeComponent();17            //Binding binding = new Binding() { ElementName = "sldrSlider",Path= new PropertyPath("Value")};18            //Binding binding = new Binding("Value") { ElementName = "sldrSlider" ,UpdateSourceTrigger=UpdateSourceTrigger.};19            //tbx.SetBinding(TextBox.TextProperty, binding);20         }21 22         private void Button_Click(object sender, RoutedEventArgs e)23         {24             //获得应用于文本框上的绑定25             BindingExpression be = tbx.GetBindingExpression(TextBox.TextProperty);26             //调用UpdateSource更新源对象27             be.UpdateSource();28         }29     }30     public class SliderValue2StringConverter:IValueConverter31     {32         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)33         {34             double valueFromSource = (double)value;35             return valueFromSource.ToString("F2");//保留两位小数36         }37  38         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)39         {40             throw new NotImplementedException("Method ConvertBack not implemented");41         }42     }43 }
View Code
1 
9
10
11
12
13
14
15
16
17
18
19
View Code

现在考虑以下场景,我们有一个椭圆,椭圆的颜色是根据RGB三个不同的分量变化的,我们让三个滑动条分别控制RGB三个分量,下面就用多值转换器进行实现。

1 using System; 2 using System.Globalization; 3 using System.Windows; 4 using System.Windows.Controls; 5 using System.Windows.Data; 6 using System.Windows.Media; 7  8 namespace BindingDemo1 9 {10     /// 11     /// Interaction logic for MainWindow.xaml12     /// 13     public partial class MainWindow : Window14     {15         public MainWindow()16         {17             InitializeComponent();18            //Binding binding = new Binding() { ElementName = "sldrSlider",Path= new PropertyPath("Value")};19            //Binding binding = new Binding("Value") { ElementName = "sldrSlider" ,UpdateSourceTrigger=UpdateSourceTrigger.};20            //tbx.SetBinding(TextBox.TextProperty, binding);21         }22 23         private void Button_Click(object sender, RoutedEventArgs e)24         {25             //获得应用于文本框上的绑定26             BindingExpression be = tbx.GetBindingExpression(TextBox.TextProperty);27             //调用UpdateSource更新源对象28             be.UpdateSource();29         }30     }31     public class SliderValue2StringConverter:IValueConverter32     {33         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)34         {35             double valueFromSource = (double)value;36             return valueFromSource.ToString("F2");//保留两位小数37         }38  39         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)40         {41             throw new NotImplementedException("Method ConvertBack not implemented");42         }43     }44     public class Rgb2ColorConverter : IMultiValueConverter45     {46         //正向修改,整合颜色值47         public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)48         {49             if (values == null || values.Length < 3)50                 return null;51             byte r = System.Convert.ToByte(values[0]);52             byte g = System.Convert.ToByte(values[1]);53             byte b = System.Convert.ToByte(values[2]);54             Color myColor = Color.FromRgb(r, g, b);55             SolidColorBrush myBrush = new SolidColorBrush(myColor);56             return myBrush;57         }58         public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)59         {60             throw new NotImplementedException("Method ConvertBack not implemented");61         }62 63     }64 }
View Code
1 
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 60
61
62
63
64
View Code

六、绑定的删除

我们可以使用类BindingOperations中的以下函数来删除绑定

public static void ClearAllBindings(DependencyObject target);

public static void ClearBinding(DependencyObject target, DependencyProperty dp);

转载于:https://www.cnblogs.com/3xiaolonglong/p/9717605.html

你可能感兴趣的文章
Spring面试题
查看>>
窥视SP2010--第一章节--SP2010开发者路线图
查看>>
MVC,MVP 和 MVVM 的图示,区别
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
统计单词,字符,和行
查看>>
jQuery垂直滑动切换焦点图
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
模运算
查看>>
python多线程的使用
查看>>
团队编程项目作业1-成员简介及分工
查看>>
使用Chrome(PC)调试移动设备上的网页
查看>>
UI基础--手写代码实现汤姆猫动画
查看>>
使用gitbash来链接mysql
查看>>
黑盒测试和百合测试的优缺点对比
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>