背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换...
生活随笔
收集整理的這篇文章主要介紹了
背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
背水一戰 Windows 10 (20) - 綁定: DataContextChanged, UpdateSourceTrigger, 對綁定的數據做自定義轉換 原文:背水一戰 Windows 10 (20) - 綁定: DataContextChanged, UpdateSourceTrigger, 對綁定的數據做自定義轉換
[源碼下載]
作者:webabcd
介紹
背水一戰 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<string> { "a", "b", "c" };}private void btnChange_Click(object sender, RoutedEventArgs e){// 修改數據上下文listBox.DataContext = new List<string> { "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
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{/// <summary>/// 正向轉換器。將值從數據源傳給綁定目標時,數據綁定引擎會調用此方法/// </summary>/// <param name="value">轉換之前的值</param>/// <param name="targetType">轉換之后的數據類型</param>/// <param name="parameter">轉換器所使用的參數(它是通過 Binding 的 ConverterParameter 傳遞過來的)</param>/// <param name="language">轉換器所使用的區域信息(它是通過 Binding 的 ConverterLanguage 傳遞過來的)</param>/// <returns>轉換后的值</returns>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;}/// <summary>/// 反向轉換器。將值從綁定目標傳給數據源時,數據綁定引擎會調用此方法/// </summary>/// <param name="value">轉換之前的值</param>/// <param name="targetType">轉換之后的數據類型</param>/// <param name="parameter">轉換器所使用的參數(它是通過 Binding 的 ConverterParameter 傳遞過來的)</param>/// <param name="language">轉換器所使用的區域信息(它是通過 Binding 的 ConverterLanguage 傳遞過來的)</param>/// <returns>轉換后的值</returns>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
[源碼下載]
轉載于:https://www.cnblogs.com/lonelyxmas/p/7567069.html
總結
以上是生活随笔為你收集整理的背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P2056 采花
- 下一篇: 51nod 1486 大大走格子(DP+