添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • DataContextChanged - FrameworkElement 的 DataContext 发生变化时触发的事件
  • UpdateSourceTrigger - 数据更新的触发方式
  • 对绑定的数据做自定义转换


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

    x:Class="Windows10.Bind.DataContextChanged" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.Bind" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" Margin="5" /> <Button x:Name="btnChange" Content="改变 listBox 的数据上下文" Click="btnChange_Click" Margin="5" /> <ListBox x:Name="listBox" ItemsSource="{Binding}" DataContextChanged="listBox_DataContextChanged" Background="Orange" Margin="5" /> </StackPanel> </Grid> </Page>

    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

    x:Class="Windows10.Bind.UpdateSourceTrigger" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.Bind" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" Foreground="Orange" Margin="5" /> UpdateSourceTrigger - 数据更新的触发方式 Default - 失去焦点后触发 PropertyChanged - 属性值发生改变后触发 Explicit - 需要通过 BindingExpression.UpdateSource() 显示触发 <TextBox Text="{Binding Text, Mode=TwoWay, ElementName=lblMsg, UpdateSourceTrigger=Default}" Margin="5" /> <TextBox Text="{Binding Text, Mode=TwoWay, ElementName=lblMsg, UpdateSourceTrigger=PropertyChanged}" Margin="5" /> <TextBox Name="txtExplicit" Text="{Binding Text, Mode=TwoWay, ElementName=lblMsg, UpdateSourceTrigger=Explicit}" Margin="5" /> <Button Name="btnBinding" Content="显示触发更新" Click="btnBinding_Click" Margin="5" /> </StackPanel> </Grid> </Page>

    Bind/UpdateSourceTrigger.xaml.cs

    * UpdateSourceTrigger - 数据更新的触发方式 * Default - 失去焦点后触发 * PropertyChanged - 属性值发生改变后触发 * Explicit - 需要通过 BindingExpression.UpdateSource() 显示触发 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 void btnBinding_Click(object sender, RoutedEventArgs e) // 显示触发 txtExplicit 的数据更新 BindingExpression be = txtExplicit.GetBindingExpression(TextBox.TextProperty); be.UpdateSource();


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

    x:Class="Windows10.Bind.BindingConverter" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.Bind" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="10 0 10 10"> 配置 IValueConverter 资源 <StackPanel.Resources> <local:IntegerLetterConverter x:Key="IntegerLetterConverter"/> </StackPanel.Resources> <Slider Name="slider1" Minimum="97" Maximum="122" Value="1" Width="300" Background="White" HorizontalAlignment="Left" Margin="5" /> 演示如何使用 Binding 的 Converter, ConverterParameter, ConverterLanguage 注:ConverterParameter 和 ConverterLanguage 不支持绑定,只能配置为一个静态的值(但是在 C# 端可以实现一些在 xaml 中无法实现的特性,详见后面的例子) <TextBox Name="textBox1" Width="300" HorizontalAlignment="Left" Margin="5" Text="{Binding ElementName=slider1, Path=Value, Mode=TwoWay, Converter={StaticResource IntegerLetterConverter}, ConverterParameter=param, ConverterLanguage=zh}" /> <Slider Name="slider2" Minimum="97" Maximum="122" Value="1" Width="300" Background="White" HorizontalAlignment="Left" Margin="5" /> 在 C# 端使用 Binding 的 Converter, ConverterParameter, ConverterLanguage <TextBox Name="textBox2" Width="300" HorizontalAlignment="Left" Margin="5" /> <TextBlock Name="lblMsg" TextWrapping="Wrap" /> </StackPanel> </Grid> </Page>

    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;