深入浅出wpf(binding篇1)_.net有点帅-编程思维

Binding在业界的使用一直是音译而来的,称为"Binding"。Binding的源是逻辑数据对象,目标则是UI层上面的控件对象。数据通过Binding送达UI层,被UI层展示出来,也就完成了数据驱动UI的过程了。

下面通过一个很简单的列子来引入我们最原始的Binding:

<Window x:Class="BindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="100" Width="400">
    <StackPanel>
        <TextBox Name="MyTextBlock" BorderBrush="Black" Margin="3"/>
        <Button Content="Add Age" Margin="3" Click="Button_Click"/>
    </StackPanel>
</Window>

Binding有一种自动机制,就是当后台绑定的属性值发生改变时,会自动通知给UI元素,怎么样才能让属性具备这样的能力呢,其实只需要在属性set的时候去触发PropertyChanged事件。这个事件不需要我们声明,只需要我们去实现INotifyPropertyChanged接口。实现了此接口的学生类如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BindingTest.Models
{
    public class Student : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public int _age;
        public int Age
        {
            get { return this._age; }
            set
            {
                if (value != 0)
                {
                    this._age = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Age)));
                }
            }
        }
    }
}

最终在窗体的后台代码中:

namespace BindingTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        Student studen;
        public MainWindow()
        {
            InitializeComponent();
            studen = new Student();
            Binding binding = new Binding();
            binding.Source = studen;
            binding.Path = new PropertyPath("Age");
            BindingOperations.SetBinding(this.MyTextBlock, TextBox.TextProperty, binding);//设置目标对象的属性和源的绑定
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            studen.Age += 1;//改变对象,页面中textbox中数据也会变化
        }
    }
}

 1绑定的源和路径

  1.1 控件作为binding的源

    Ui元素之间有时候需要进行一些关联效果可以利用Binding在控件之间建立关联,下面的代码就是将TextBlock的text和Slider(滑动条)的value进行了关联。运行下面这段代码就会发现当Slider滑动的时候,TextBlock中的值会随之改变。

<Window x:Class="BindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="100" Width="400">
    <StackPanel>
        <Slider Value="0" Name="slider1" Minimum="0" Maximum="100"></Slider>
        <TextBlock Text="{Binding ElementName=slider1,Path=Value}" Margin="3"></TextBlock>
    </StackPanel>
</Window>

可以通过设置Binding的Mode来设置数据流向,一般有TwoWay,OneWay,OnTime,OneWayToSource以及Default,如果不设置就是Default,如果你的目标控件是用户可编辑的就是双向的,比如TextBox如果是不可编辑的,那么就是单向的,比如TextBlock。

 

 

 

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/qwqwQAQ/p/11468958.html

(原创)[c#] gdi+ 之鼠标交互:原理、示例、一步步深入、性能优化_leslie_xin-编程思维

一、前言 “GDI+”与“鼠标交互”,乍一听好像不可能,也无从下手,但是实现原理比想象中要简单很多。 基于“GDI+”的“交互”,应用场景也很多,比如:流程图、数据图表、思维导图等等。 本篇文章就通过多个示例来讲解一下 GDI+ 与鼠标交互的原理,以及如何去实现。 每一个示例实现后,都会对示例进行优化,主要是解决一些在

abp中的数据过滤器_阿升1990-编程思维

  本文首先介绍了ABP内置的软删除过滤器(ISoftDelete)和多租户过滤器(IMultiTenant),然后介绍了如何实现一个自定义过滤器,最后介绍了在软件开发过程中遇到的实际问题,同时给出了解决问题的一个未必最优的思路。 一.预定义过滤器   ABP中的数据过滤器源码在Volo.Abp.Data[2]包中,官

swift的optional类型_mr 布鲁斯-编程思维

我们使用Swift这个苹果新推出的编程语言已经有一段时间了。其中的一个极大的优点就是苹果称为“optional types”的东西。几乎所有的objective-c程序员都知道用nil来表示某个引用类型的对象是没有值的。但是要把nil和某个变量的类型联系起来还是有些牵强。 这里,我们就来介绍一下Swift提供的opti

binding_keenleung-编程思维

1)数据源  添加一个Student类: (Binding是一种自动机制,当值变化后属性要有能力通知Binding,让Binding把变化传递给UI元素。方法是在属性set语句中激发一个PropertyChanged事件。这个事件不用我们声明,我们要做到的是让作为数据源的类实现System.ComponentModel

在wpf中一种较好的绑定enums数据方法-编程思维

引言 在你使用wpf应用程序开发的时候,是否需要进行数据绑定到Enum数据呢?在这篇文章中,我将向你展示在WPF中处理Enum数据绑定的方法。 假设存在一个这样的Enum数据的定义,具体内容如下文代码中所示: namespace LocalizeFrameworkWpfApp { public enum Sta