背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合, 通过 Binding 绑定字典表

简介: 原文:背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合, 通过 Binding 绑定字典表[源码下载] 背水一战 Windows 10 (22) - 绑定: 通过...
原文: 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合, 通过 Binding 绑定字典表

[源码下载]


背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合, 通过 Binding 绑定字典表



作者:webabcd


介绍
背水一战 Windows 10 之 绑定

  • 通过 Binding 绑定对象
  • 通过 x:Bind 绑定对象
  • 通过 Binding 绑定集合
  • 通过 x:Bind 绑定集合
  • 通过 Binding 绑定字典表



示例
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 绑定对象
 * 
 * 
 * 如果需要数据源在属性值发生变化时对外通知,则需要实现 INotifyPropertyChanged 接口(为了简化实现,建议继承 Common/BindableBase.cs 这个类)
 *     PropertyChanged - 对象的属性的值发生变化时触发的事件
 */

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 绑定的相关知识点
 * 
 * 
 * 如果需要数据源在属性值发生变化时对外通知,则需要实现 INotifyPropertyChanged 接口(为了简化实现,建议继承 Common/BindableBase.cs 这个类)
 *     PropertyChanged - 对象的属性的值发生变化时触发的事件
 */

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

namespace Windows10.Bind
{
    // x:Bind 的数据上下文就是它所属的 Page 或 UserControl
    public sealed partial class BindDemo : Page
    {
        public BindDemo()
        {
            this.InitializeComponent();
        }

        // 事件绑定到方法,无参数
        private void EventBindNoArgs()
        {
            CurrentEmployee.Name = "wanglei" + new Random().Next(1000, 10000).ToString();
        }

        // 事件绑定到方法,参数与对应的事件的参数相同
        private void EventBindRegularArgs(object sender, RoutedEventArgs e)
        {
            CurrentEmployee.Name = "wanglei" + new Random().Next(1000, 10000).ToString();
        }

        // 事件绑定到方法,参数与对应的事件的参数相同,但是其中的事件参数为 object 类型
        private void EventBindBaseArgs(object sender, object e)
        {
            CurrentEmployee.Name = "wanglei" + new Random().Next(1000, 10000).ToString();
        }

        public Employee CurrentEmployee { get; set; } = new Employee() { Name = "wanglei", Age = 36, IsMale = true };

        public ObservableCollection<Employee> AllEmployees { get; set; } = TestData.GetEmployees(5);
    }
}


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 绑定集合
 * 
 * 
 * 如果需要集合数据源在数据添加,删除,更新时对外通知,则需要实现 INotifyCollectionChanged 接口
 *     CollectionChanged - 集合数据在发生添加,删除,更新时触发的事件
 */

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 接口
        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());

            // 集合数据在发生添加,删除,更新时触发的事件(源自 INotifyCollectionChanged 接口)
            _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 绑定集合
 * 
 * 
 * 如果需要集合数据源在数据添加,删除,更新时对外通知,则需要实现 INotifyCollectionChanged 接口
 *     CollectionChanged - 集合数据在发生添加,删除,更新时触发的事件
 */

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 接口
        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)
        {
            // 集合数据在发生添加,删除,更新时触发的事件(源自 INotifyCollectionChanged 接口)
            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() };
        }
    }
}


5、演示如何通过 Binding 绑定字典表
Bind/BindingDictionary.xaml

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

            <ComboBox x:Name="combo" SelectionChanged="combo_SelectionChanged" Margin="5">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Key}"/>
                            <TextBlock Text=" - "/>
                            <TextBlock Text="{Binding Value}"/>
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
            
        </StackPanel>
    </Grid>
</Page>

Bind/BindingDictionary.xaml.cs

/*
 * 演示如何通过 Binding 绑定字典表
 */

using System.Collections.Generic;
using Windows.UI.Xaml.Controls;

namespace Windows10.Bind
{
    public sealed partial class BindingDictionary : Page
    {
        private Dictionary<string, string> _data;

        public BindingDictionary()
        {
            this.InitializeComponent();

            _data = new Dictionary<string, string>();
            _data.Add("key1", "value1");
            _data.Add("key2", "value2");
            _data.Add("key3", "value3");

            combo.ItemsSource = _data;
        }
        
        private void combo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            KeyValuePair<string, string> selectedItem = (KeyValuePair<string, string>)combo.SelectedItem;
            lblMsg.Text = $"selectedItem: {selectedItem.Key}, {selectedItem.Value}";
        }
    }
}



OK
[源码下载]

目录
相关文章
|
7月前
|
JavaScript Java Windows
函数和windows对象 有惊喜✔
函数和windows对象 有惊喜✔
|
8月前
|
程序员 C++ Windows
Windows C++ 启动子进程并绑定子进程,主进程结束关闭后自动结束关闭子进程
在Windows平台上主进程启动子进程,并使主进程结束关闭后自动结束关闭子进程
106 0
|
Shell Windows
windows出现错误0x800401E5:没有供标记使用的对象
windows出现错误0x800401E5:没有供标记使用的对象
windows出现错误0x800401E5:没有供标记使用的对象
|
27天前
|
应用服务中间件 nginx Windows
【报错】Windows下启动nginx报:bind() to 0.0.0.0:80 failed...
【报错】Windows下启动nginx报:bind() to 0.0.0.0:80 failed...
|
5月前
|
监控 安全 API
7.2 Windows驱动开发:内核注册并监控对象回调
在笔者上一篇文章`《内核枚举进程与线程ObCall回调》`简单介绍了如何枚举系统中已经存在的`进程与线程`回调,本章`LyShark`将通过对象回调实现对进程线程的`句柄`监控,在内核中提供了`ObRegisterCallbacks`回调,使用这个内核`回调`函数,可注册一个`对象`回调,不过目前该函数`只能`监控进程与线程句柄操作,通过监控进程或线程句柄,可实现保护指定进程线程不被终止的目的。
31 0
7.2 Windows驱动开发:内核注册并监控对象回调
|
5月前
|
监控 安全 Windows
4.3 Windows驱动开发:监控进程与线程对象操作
在内核中,可以使用`ObRegisterCallbacks`这个内核回调函数来实现监控进程和线程对象操作。通过注册一个`OB_CALLBACK_REGISTRATION`回调结构体,可以指定所需的回调函数和回调的监控类型。这个回调结构体包含了回调函数和监控的对象类型,还有一个`Altitude`字段,用于指定回调函数的优先级。优先级越高的回调函数会先被调用,如果某个回调函数返回了一个非NULL值,后续的回调函数就不会被调用。当有进程或线程对象创建、删除、复制或重命名时,内核会调用注册的回调函数。回调函数可以访问被监控对象的信息,如句柄、进程ID等,并可以采取相应的操作,如打印日志、记录信息等。
35 0
4.3 Windows驱动开发:监控进程与线程对象操作
|
6月前
|
网络协议 流计算 Windows
2.5 Windows驱动开发:DRIVER_OBJECT对象结构
在Windows内核中,每个设备驱动程序都需要一个`DRIVER_OBJECT`对象,该对象由系统创建并传递给驱动程序的`DriverEntry`函数。驱动程序使用此对象来注册与设备对象和其他系统对象的交互,并在操作系统需要与驱动程序进行交互时使用此对象。`DRIVER_OBJECT`对象还包含了与驱动程序所管理的设备对象相关联的设备扩展结构,以及用于处理`I/O`请求的函数指针等信息。它是驱动程序与操作系统内核之间的桥梁,用于协调设备的操作和管理。
46 0
2.5 Windows驱动开发:DRIVER_OBJECT对象结构
|
安全 Ubuntu Linux
Windows提权漏洞集合
Windows提权漏洞集合
326 0
Windows提权漏洞集合
|
Linux Shell Windows
Windows-Linux:Windows系统下的命令类似Linux系统下的所有命令集合
Windows-Linux:Windows系统下的命令类似Linux系统下的所有命令集合
Windows-Linux:Windows系统下的命令类似Linux系统下的所有命令集合
Windows 系统添加和修改 hosts 绑定的方法
Hosts 绑定的作用是把一个或者多个域名指向到一个 IP 地址。一般用户在测试场景使用。Windows hosts 在 C:WINDOWSsystem32driversetc 目录下,所以打开我的电脑,在地址栏输入: C:WINDOWSsystem32driversetc 即可跳转到 etc 目录。
27655 1

热门文章

最新文章