重新想象 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
[源碼下載]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM