博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换...
阅读量:6806 次
发布时间:2019-06-26

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

原文:

背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换

作者:
介绍
背水一战 Windows 10 之 绑定

  • DataContextChanged - FrameworkElement 的 DataContext 发生变化时触发的事件
  • UpdateSourceTrigger - 数据更新的触发方式
  • 对绑定的数据做自定义转换

示例
1、演示 DataContextChanged 的用法
Bind/DataContextChanged.xaml

Bind/DataContextChanged.xaml.cs

/* * DataContextChanged - FrameworkElement 的 DataContext 发生变化时触发的事件 */using System;using System.Collections.Generic;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;namespace Windows10.Bind{    public sealed partial class DataContextChanged : Page    {        public DataContextChanged()        {            this.InitializeComponent();            this.Loaded += DataContextChanged_Loaded;        }        private void DataContextChanged_Loaded(object sender, RoutedEventArgs e)        {            // 指定数据上下文            listBox.DataContext = new List
{ "a", "b", "c" }; } private void btnChange_Click(object sender, RoutedEventArgs e) { // 修改数据上下文 listBox.DataContext = new List
{ "a", "b", new Random().Next(0, 1000).ToString().PadLeft(3, '0') }; } private void listBox_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args) { /* * FrameworkElement.DataContextChanged - 数据上下文发生改变后触发的事件 */ // 数据上下文发生改变后 lblMsg.Text = "数据上下文发生改变:" + DateTime.Now.ToString("hh:mm:ss"); } }}

2、演示 UpdateSourceTrigger 的用法
Bind/UpdateSourceTrigger.xaml

Bind/UpdateSourceTrigger.xaml.cs

/* * UpdateSourceTrigger - 数据更新的触发方式 *     Default - 失去焦点后触发 *     PropertyChanged - 属性值发生改变后触发 *     Explicit - 需要通过 BindingExpression.UpdateSource() 显示触发 *      *      * BindingExpression - 绑定信息,可以通过 FrameworkElement 的 GetBindingExpression() 方法获取指定属性的绑定信息 *     DataItem - 获取绑定的源对象 *     ParentBinding - 获取绑定的 Binding 对象(Binding 对象里包括 ElementName, Path, Mode 等绑定信息) *     UpdateSource() - 将当前值发送到 TwoWay 绑定的源对象的绑定的属性中 */using System;using Windows.UI.Popups;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Data;namespace Windows10.Bind{    public sealed partial class UpdateSourceTrigger : Page    {        public UpdateSourceTrigger()        {            this.InitializeComponent();        }        private async void btnBinding_Click(object sender, RoutedEventArgs e)        {            // 显示触发 txtExplicit 的数据更新            BindingExpression be = txtExplicit.GetBindingExpression(TextBox.TextProperty);            be.UpdateSource();            // 获取绑定的相关信息            Binding binding = be.ParentBinding;            TextBlock textBlock = be.DataItem as TextBlock;            MessageDialog messageDialog = new MessageDialog($"BindingExpression.DataItem:{textBlock.Name}, Binding.Mode:{binding.Mode}");            await messageDialog.ShowAsync();        }    }}

3、演示如何对绑定的数据做自定义转换
Bind/BindingConverter.xaml

格式化字符串 {0}

Bind/BindingConverter.xaml.cs

/* * 演示如何对绑定的数据做自定义转换 */using System;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Data;namespace Windows10.Bind{    public sealed partial class BindingConverter : Page    {        public BindingConverter()        {            this.InitializeComponent();            this.Loaded += BindingConverter_Loaded;        }        private void BindingConverter_Loaded(object sender, RoutedEventArgs e)        {            // 实例化 Binding 对象            Binding binding = new Binding()            {                ElementName = nameof(slider2),                Path = new PropertyPath(nameof(Slider.Value)),                Mode = BindingMode.TwoWay, // 默认是 OneWay 的                Converter = new IntegerLetterConverter(),                ConverterParameter = lblMsg, // 将 ConverterParameter 设置为一个指定的控件,这个在 xaml 中实现不了,但是可以在 C# 端实现                ConverterLanguage = "zh"            };            // 将目标对象的目标属性与指定的 Binding 对象关联            BindingOperations.SetBinding(textBox2, TextBox.TextProperty, binding);        }    }    // 自定义一个实现了 IValueConverter 接口的类,用于对绑定的数据做自定义转换    public sealed class IntegerLetterConverter : IValueConverter    {        ///         /// 正向转换器。将值从数据源传给绑定目标时,数据绑定引擎会调用此方法        ///         /// 转换之前的值        /// 转换之后的数据类型        /// 转换器所使用的参数(它是通过 Binding 的 ConverterParameter 传递过来的)        /// 转换器所使用的区域信息(它是通过 Binding 的 ConverterLanguage 传递过来的)        /// 
转换后的值
public object Convert(object value, Type targetType, object parameter, string language) { if (parameter != null && parameter.GetType() == typeof(TextBlock)) { ((TextBlock)parameter).Text = $"value: {value}, targetType: {targetType}, parameter: {parameter}, language: {language}"; } int v = (int)(double)value; return (char)v; } /// /// 反向转换器。将值从绑定目标传给数据源时,数据绑定引擎会调用此方法 /// /// 转换之前的值 /// 转换之后的数据类型 /// 转换器所使用的参数(它是通过 Binding 的 ConverterParameter 传递过来的) /// 转换器所使用的区域信息(它是通过 Binding 的 ConverterLanguage 传递过来的) ///
转换后的值
public object ConvertBack(object value, Type targetType, object parameter, string language) { if (parameter != null && parameter.GetType() == typeof(TextBlock)) { ((TextBlock)parameter).Text = $"value: {value}, targetType: {targetType}, parameter: {parameter}, language: {language}"; } int v = ((string)value).ToCharArray()[0]; return v; } } // 自定义一个实现了 IValueConverter 接口的类,用于格式化字符串 public sealed class FormatConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { string format = (string)parameter; return string.Format(format, value); } public object ConvertBack(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } }}

OK

转载地址:http://ienwl.baihongyu.com/

你可能感兴趣的文章
IO模型总结
查看>>
实战 Spring MVC接入支付宝即时到账 (部分代码)
查看>>
随想系列_5_乱七八糟
查看>>
PUTTY用密钥登陆服务器
查看>>
并发编程总结3——JUC-LOCK-1
查看>>
np.random.choice方法
查看>>
第一篇
查看>>
洛谷P4721 【模板】分治 FFT(分治FFT)
查看>>
BI技术
查看>>
检查hdfs块的块-fsck
查看>>
Asp程序的IIS发布
查看>>
设计模式4-代理模式
查看>>
php7扩展开发[8]类方法之间的调用
查看>>
通过C语言HelloWord程序对计算系统理解
查看>>
vue之better-scroll的封装,包含下拉刷新,上拉加载功能及UI(核心为借鉴,我仅仅是给轮子套上了外胎...)...
查看>>
HTML基础-------最初概念以及相关语法
查看>>
如何理解代理?
查看>>
python基础:冒泡和选择排序算法实现
查看>>
python基础一 day13 复习
查看>>
appium===安卓SDK下载很慢的解决办法
查看>>