重新想象 Windows 8.1 Store Apps (82) - 绑定: DataContextChanged, TargetNullValue, FallbackValue, UpdateSourceTrigger
重新想象 Windows 8.1 Store Apps (82) - 绑定: DataContextChanged, TargetNullValue, FallbackValue, UpdateSourceTrigger
作者:webabcd
介绍
重新想象 Windows 8.1 Store Apps 之绑定
- DataContextChanged - FrameworkElement 的 DataContext 发生变化时触发的事件
- TargetNullValue - 当绑定数据为 null 时所需要显示的值
- FallbackValue - 当绑定失败(无法返回值)的时候所需要显示的值
- UpdateSourceTrigger - UI 上数据更新的触发方式
示例
1、演示 DataContextChanged 的应用
DataContextChanged.xaml
<Page x:Class="Windows81.Binding.DataContextChanged" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows81.Binding" 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="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" /> <Button x:Name="btnChange" Content="改变数据上下文" Click="btnChange_Click" Margin="0 10 0 0" /> <ListBox x:Name="listBox" ItemsSource="{Binding}" DataContextChanged="listBox_DataContextChanged" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
DataContextChanged.xaml.cs
/* * DataContextChanged - FrameworkElement 的 DataContext 发生变化时触发的事件 * * * 关于绑定的基础请参见: * http://www.cnblogs.com/webabcd/archive/2013/08/19/3267115.html * http://www.cnblogs.com/webabcd/archive/2013/08/22/3274099.html * http://www.cnblogs.com/webabcd/archive/2013/08/26/3281822.html * http://www.cnblogs.com/webabcd/archive/2013/08/29/3288304.html */ using System; using System.Collections.Generic; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Windows81.Binding { public sealed partial class DataContextChanged : Page { public DataContextChanged() { this.InitializeComponent(); this.Loaded += new RoutedEventHandler(DataContextChanged_Loaded); } 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、演示 TargetNullValue 和 FallbackValue 的应用
TargetNullValueFallbackValue.xaml
<Page x:Class="Windows81.Binding.TargetNullValueFallbackValue" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows81.Binding" 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 Name="stackPanel" Margin="120 0 0 0"> <!-- FallbackValue - 当绑定失败(无法返回值)的时候所需要显示的值 --> <TextBlock FontSize="14.667" Text="{Binding Path=xxx, FallbackValue='绑定失败时的默认值'}" /> <!-- TargetNullValue - 当绑定数据为 null 时所需要显示的值 --> <TextBlock FontSize="14.667" Text="{Binding Path=Name, TargetNullValue='绑定返回值为 null'}" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
TargetNullValueFallbackValue.xaml.cs
/* * TargetNullValue - 当绑定数据为 null 时所需要显示的值 * FallbackValue - 当绑定失败(无法返回值)的时候所需要显示的值 * * * 关于绑定的基础请参见: * http://www.cnblogs.com/webabcd/archive/2013/08/19/3267115.html * http://www.cnblogs.com/webabcd/archive/2013/08/22/3274099.html * http://www.cnblogs.com/webabcd/archive/2013/08/26/3281822.html * http://www.cnblogs.com/webabcd/archive/2013/08/29/3288304.html */ using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace Windows81.Binding { public sealed partial class TargetNullValueFallbackValue : Page { public TargetNullValueFallbackValue() { this.InitializeComponent(); } protected override void OnNavigatedTo(NavigationEventArgs e) { stackPanel.DataContext = new TargetNullValueTest { Name = null }; } } public sealed class TargetNullValueTest { public string Name { get; set; } } }
3、演示 UpdateSourceTrigger 的应用
UpdateSourceTrigger.xaml
<Page x:Class="Windows81.Binding.UpdateSourceTrigger" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows81.Binding" 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 Name="stackPanel" Margin="120 0 0 0"> <TextBlock Name="lblMsg" /> <!-- UpdateSourceTrigger - UI 上数据更新的触发方式 Default - 失去焦点后触发 PropertyChanged - 属性值发生改变后触发 Explicit - 需要通过 BindingExpression.UpdateSource() 显示触发 --> <TextBox Text="{Binding Text, Mode=TwoWay, ElementName=lblMsg, UpdateSourceTrigger=Default}" Margin="0 10 0 0" /> <TextBox Text="{Binding Text, Mode=TwoWay, ElementName=lblMsg, UpdateSourceTrigger=PropertyChanged}" Margin="0 10 0 0" /> <TextBox Name="txtExplicit" Text="{Binding Text, Mode=TwoWay, ElementName=lblMsg, UpdateSourceTrigger=Explicit}" Margin="0 10 0 0" /> <Button Name="btnBinding" Content="显示触发更新" Click="btnBinding_Click" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
UpdateSourceTrigger.xaml.cs
/* * UpdateSourceTrigger - UI 上数据更新的触发方式 * Default - 失去焦点后触发 * PropertyChanged - 属性值发生改变后触发 * Explicit - 需要通过 BindingExpression.UpdateSource() 显示触发 * * * 关于绑定的基础请参见: * http://www.cnblogs.com/webabcd/archive/2013/08/19/3267115.html * http://www.cnblogs.com/webabcd/archive/2013/08/22/3274099.html * http://www.cnblogs.com/webabcd/archive/2013/08/26/3281822.html * http://www.cnblogs.com/webabcd/archive/2013/08/29/3288304.html */ using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Data; namespace Windows81.Binding { 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(); } } }
OK
[源码下载]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?