背水一戰 Windows 10 (22) - 綁定: 通過 Binding 綁定對象, 通過 x:Bind 綁定對象, 通過 Binding 綁定集合, 通過 x:Bind 綁定集合

来源:http://www.cnblogs.com/webabcd/archive/2016/07/11/5659170.html
-Advertisement-
Play Games

背水一戰 Windows 10 之 綁定: 通過 Binding 綁定對象, 通過 x:Bind 綁定對象, 通過 Binding 綁定集合, 通過 x:Bind 綁定集合 ...


[源碼下載]


背水一戰 Windows 10 (22) - 綁定: 通過 Binding 綁定對象, 通過 x:Bind 綁定對象, 通過 Binding 綁定集合, 通過 x:Bind 綁定集合



作者:webabcd


介紹
背水一戰 Windows 10 之 綁定

  • 通過 Binding 綁定對象
  • 通過 x:Bind 綁定對象
  • 通過 Binding 綁定集合
  • 通過 x:Bind 綁定集合



示例
1、演示如何通過 Binding 綁定對象
Bind/BindingModel.xaml

<Page
    x:Class="Windows10.Bind.BindingModel"
    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 Name="root" Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <TextBlock Name="lblMsg" Margin="5" />

            <TextBox Text="{Binding Name, Mode=TwoWay}" Margin="5" />
            <TextBox Text="{Binding Age, Mode=TwoWay}" Margin="5" />
            <ToggleSwitch IsOn="{Binding IsMale, Mode=TwoWay}" OffContent="女" OnContent="男" Header="性別" Margin="5" />

        </StackPanel>
    </Grid>
</Page>

Bind/BindingModel.xaml.cs

/*
 * 演示如何通過 Binding 綁定對象
 */

using System;
using System.ComponentModel;
using Windows.System.Threading;
using Windows.UI.Core;
using Windows.UI.Xaml.Controls;
using Windows10.Common;

namespace Windows10.Bind
{
    public sealed partial class BindingModel : Page
    {
        private Employee _employee;

        public BindingModel()
        {
            this.InitializeComponent();

            this.Loaded += BindingModel_Loaded;
        }

        void BindingModel_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            // 創建一個需要綁定的實體對象(註:Employee 實現了 INotifyPropertyChanged 介面)
            _employee = new Employee();
            _employee.Name = "webabcd";
            _employee.Age = 33;
            _employee.IsMale = true;

            // Employee 對象的屬性的值發生變化時觸發的事件(源自 INotifyPropertyChanged 介面)
            _employee.PropertyChanged += _employee_PropertyChanged;

            // 指定數據上下文(綁定的數據源)
            root.DataContext = _employee;

            // 每 5 秒更新一次數據
            ThreadPoolTimer.CreatePeriodicTimer
            (
                (timer) =>
                {
                    var ignored = Dispatcher.RunAsync
                    (
                        CoreDispatcherPriority.Normal,
                        () =>
                        {
                            Random random = new Random();
                            _employee.Age = random.Next(10, 100);
                            _employee.IsMale = random.Next() % 2 == 0 ? true : false;
                        }
                    );
                },
                TimeSpan.FromMilliseconds(5000)
            );
        }

        // 每次屬性的值發生變化時,顯示變化後的結果
        void _employee_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            lblMsg.Text = "屬性:“" + e.PropertyName + "”的值發生了變化";
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += string.Format("當前的值為:Name-{0}, Age-{1}, IsMale-{2}", _employee.Name, _employee.Age, _employee.IsMale);
        }
    }
}


2、演示如何通過 x:Bind 綁定對象
Bind/BindModel.xaml

<Page
    x:Class="Windows10.Bind.BindModel"
    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" />

            <TextBox Text="{x:Bind CurrentEmployee.Name, Mode=TwoWay}" Margin="5" />
            <TextBox Text="{x:Bind CurrentEmployee.Age, Mode=TwoWay}" Margin="5" />
            <ToggleSwitch IsOn="{x:Bind CurrentEmployee.IsMale, Mode=TwoWay}" OffContent="女" OnContent="男" Header="性別" Margin="5" />
          
        </StackPanel>
    </Grid>
</Page>

Bind/BindModel.xaml.cs

/*
 * 演示如何通過 x:Bind 綁定對象
 */

using System;
using System.ComponentModel;
using Windows.System.Threading;
using Windows.UI.Core;
using Windows.UI.Xaml.Controls;
using Windows10.Common;

namespace Windows10.Bind
{
    public sealed partial class BindModel : Page
    {
        // Employee 實現了 INotifyPropertyChanged 介面
        public Employee CurrentEmployee { get; set; } = new Employee() { Name = "wanglei", Age = 36, IsMale = true };

        public BindModel()
        {
            this.InitializeComponent();

            this.Loaded += BindingModel_Loaded;
        }

        void BindingModel_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            // 每 5 秒更新一次數據
            ThreadPoolTimer.CreatePeriodicTimer
            (
                (timer) =>
                {
                    var ignored = Dispatcher.RunAsync
                    (
                        CoreDispatcherPriority.High,
                        () =>
                        {
                            Random random = new Random();
                            CurrentEmployee.Age = random.Next(10, 100);
                            CurrentEmployee.IsMale = random.Next() % 2 == 0 ? true : false;
                        }
                    );
                },
                TimeSpan.FromMilliseconds(5000)
            );

            // Employee 對象的屬性的值發生變化時觸發的事件(源自 INotifyPropertyChanged 介面)
            CurrentEmployee.PropertyChanged += CurrentEmployee_PropertyChanged;
        }

        private void CurrentEmployee_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            lblMsg.Text = "屬性:“" + e.PropertyName + "”的值發生了變化";
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += string.Format("當前的值為:Name-{0}, Age-{1}, IsMale-{2}", CurrentEmployee.Name, CurrentEmployee.Age, CurrentEmployee.IsMale);
        }
    }
}


3、示如何通過 Binding 綁定集合
Bind/BindingCollection.xaml

<Page
    x:Class="Windows10.Bind.BindingCollection"
    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 Orientation="Vertical" VerticalAlignment="Top" Margin="10 0 10 10">
            
            <Button Name="btnDelete" Content="刪除第 1 條數據" Click="btnDelete_Click" Margin="5" />
            <Button Name="btnUpdate" Content="更新前 2 條數據" Click="btnUpdate_Click" Margin="5" />

            <ListView x:Name="listView" Margin="5">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Border Background="Blue" Width="200" CornerRadius="3" HorizontalAlignment="Left">
                            <TextBlock Text="{Binding Name}" />
                        </Border>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            
        </StackPanel>
    </Grid>
</Page>

Bind/BindingCollection.xaml.cs

/*
 * 演示如何通過 Binding 綁定集合
 */

using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows10.Common;

namespace Windows10.Bind
{
    public sealed partial class BindingCollection : Page
    {
        // ObservableCollection<T> 實現了 INotifyCollectionChanged 介面
        // ObservableCollection<T> 雖然也實現了 INotifyPropertyChanged 介面,但是其對應的 event 是 protected 的,所以不可用(需要的話就自己再封一層)
        private ObservableCollection<Employee> _employees;

        public BindingCollection()
        {
            this.InitializeComponent();

            this.Loaded += BindingCollection_Loaded;
        }

        void BindingCollection_Loaded(object sender, RoutedEventArgs e)
        {
            _employees = new ObservableCollection<Employee>(TestData.GetEmployees());
            _employees.CollectionChanged += _employees_CollectionChanged;

            // 指定 ListView 的數據源
            listView.ItemsSource = _employees;
        }

        void _employees_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            /*
             * e.Action - 引發此事件的操作類型(NotifyCollectionChangedAction 枚舉)
             *     Add, Remove, Replace, Move, Reset
             * e.OldItems - Remove, Replace, Move 操作時影響的數據列表
             * e.OldStartingIndex - Remove, Replace, Move 操作發生處的索引
             * e.NewItems - 更改中所涉及的新的數據列表
             * e.NewStartingIndex - 更改中所涉及的新的數據列表的發生處的索引
             */
        }

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            // 此處的通知來自 INotifyCollectionChanged 介面
            _employees.RemoveAt(0);
        }

        private void btnUpdate_Click(object sender, RoutedEventArgs e)
        {
            Random random = new Random();

            // 此處的通知來自實現了 INotifyPropertyChanged 介面的 Employee
            _employees.First().Name = random.Next(1000, 10000).ToString();

            // 此處的通知來自 INotifyCollectionChanged 介面
            _employees[1] = new Employee() { Name = random.Next(1000, 10000).ToString() };
        }
    }
}


4、演示如何通過 x:Bind 綁定集合
Bind/BindCollection.xaml

<Page
    x:Class="Windows10.Bind.BindCollection"
    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"
    
    xmlns:common="using:Windows10.Common"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Orientation="Vertical" VerticalAlignment="Top" Margin="10 0 10 10">
            
            <Button Name="btnDelete" Content="刪除第 1 條數據" Click="btnDelete_Click" Margin="5" />
            <Button Name="btnUpdate" Content="更新前 2 條數據" Click="btnUpdate_Click" Margin="5" />

            <ListView x:Name="listView" ItemsSource="{x:Bind Employees}" Margin="5">
                <ListView.ItemTemplate>
                    <DataTemplate x:DataType="common:Employee">
                        <Border Background="Blue" Width="200" CornerRadius="3" HorizontalAlignment="Left">
                            <TextBlock Text="{x:Bind Name, Mode=OneWay}" />
                        </Border>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            
        </StackPanel>
    </Grid>
</Page>

Bind/BindCollection.xaml.cs

/*
 * 演示如何通過 x:Bind 綁定集合
 */

using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows10.Common;

namespace Windows10.Bind
{
    public sealed partial class BindCollection : Page
    {
        // 數據源
        // ObservableCollection<T> 實現了 INotifyCollectionChanged 介面
        // ObservableCollection<T> 雖然也實現了 INotifyPropertyChanged 介面,但是其對應的 event 是 protected 的,所以不可用(需要的話就自己再封一層)
        public ObservableCollection<Employee> Employees { get; set; } = new ObservableCollection<Employee>(TestData.GetEmployees());

        public BindCollection()
        {
            this.InitializeComponent();

            this.Loaded += BindCollection_Loaded;
        }

        void BindCollection_Loaded(object sender, RoutedEventArgs e)
        {
            Employees.CollectionChanged += _employees_CollectionChanged;
        }

        void _employees_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            /*
             * e.Action - 引發此事件的操作類型(NotifyCollectionChangedAction 枚舉)
             *     Add, Remove, Replace, Move, Reset
             * e.OldItems - Remove, Replace, Move 操作時影響的數據列表
             * e.OldStartingIndex - Remove, Replace, Move 操作發生處的索引
             * e.NewItems - 更改中所涉及的新的數據列表
             * e.NewStartingIndex - 更改中所涉及的新的數據列表的發生處的索引
             */
        }

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            // 此處的通知來自 INotifyCollectionChanged 介面
            Employees.RemoveAt(0);
        }

        private void btnUpdate_Click(object sender, RoutedEventArgs e)
        {
            Random random = new Random();

            // 此處的通知來自實現了 INotifyPropertyChanged 介面的 Employee
            Employees.First().Name = random.Next(1000, 10000).ToString();

            // 此處的通知來自 INotifyCollectionChanged 介面
            Employees[1] = new Employee() { Name = random.Next(1000, 10000).ToString() };
        }
    }
}



OK
[源碼下載]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天看圖解CSS的章節,雖然主要講的是nth-of-type選擇器的使用,但是本人卻關註到了頁面的排版方式,如下: HTML CSS 效果: 然後百思不得其解,因為img本身為行內元素,加了float之後變成了inline-block元素,兼有塊狀元素與行內元素的“氣質”,但緊跟在其後面的p元素是真 ...
  • 響應式佈局的開發基礎知識 本章主要分為以下幾個部分 正確理解響應式設計 響應式設計的步驟 響應式設計需要註意的問題 響應式網頁佈局實現原理 第一:正確理解響應式佈局 響應式網頁設計就是一個網站能夠相容多個終端 而不是為每個終端做一個特定的版本。打個比方來說:現在社會有很多響應產品,例如摺疊沙發,摺疊 ...
  • 這段是html中的代碼 這是css中的代碼 在網頁中的顯示出來是這樣的 經過自己的實驗發現頭部引入的優先順序高於外部引入,頭一次寫博客寫的不好大家多提提建議。 ...
  • 1. 頁面內容較多, 從底部超鏈接 點擊回到頁面頂部 ...
  • next()相鄰下一個同級元素 prev()相鄰上一個同級元素 siblings()所有同級元素 ...
  • 在iis7中預設的MIME類型並不包含所有的尾碼名文件,像現在比較熱門的apk,ipa文件都是需要手動添加的。 那如何在IIS添加MIME類型?步驟如下: 1、打開iis7,選擇你要設置網站,打開mime類型選項 2、點擊右邊的“添加”按鈕進行添加 3、輸入文件擴展名跟MIME類型 更多的MIME類 ...
  • 常常有一些特殊的MIME類型是IIS中沒有的,一般來說要我們自己手動添加。如果網站經常更換伺服器或者網站代碼是提供給多個用戶使用,那麼會造成網站中用到的特殊的MIME類型要經常性的在IIS上配置。這裡考慮到一個網站配置通用性問題,所以我們可以將MIME類型添加到ASP.NET網站的配置文件中,這樣用 ...
  • 前言 在前面文章中,介紹了 ASP.NET Core在 macOS,Linux 上基於Nginx和Jexus的發佈和部署,本篇文章主要是如何在Docker容器中運行ASP.NET Core應用程式。 ASP.NET Nginx 發佈和部署 : "http://www.cnblogs.com/savo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...