title author date CreateTime categories
WPF 绑定的默认模式
lindexi
2019-04-12 09:38:58 +0800
2019-04-12 09:37:55 +0800
WPF

小伙伴绑定了一个属性,但是发现属性在更新的时候没有同步到后台,他说在 WPF 绑定的默认值是什么?为什么没有设置 Mode 的属性,有的是双向有的是单向?本文就来告诉大家在 WPF 定义的依赖属性是如何控制绑定的是双向还是单向的方法

在依赖属性或附加属性,都可以在定义的时候传入 FrameworkPropertyMetadata 请看代码

        public static readonly DependencyProperty TwoWayProperty =
DependencyProperty.Register("TwoWay", typeof(string), typeof(MainWindow), new FrameworkPropertyMetadata(""));

上面代码的使用和默认不相同,修改 PropertyMetadata 为 FrameworkPropertyMetadata 虽然传入的默认值参数都是一样的,但是 FrameworkPropertyMetadata 可以传入更多的参数,如可以传入 FrameworkPropertyMetadataOptions 变量

在 FrameworkPropertyMetadataOptions 变量可以通过设置 BindsTwoWayByDefault 指定这个值默认的绑定是双向的

虽然从 Binding 的 Mode 的枚举的定义是

    public enum BindingMode
{
TwoWay,
OneWay,
OneTime,
OneWayToSource,
Default
}

默认的枚举值 0 是 TwoWay 但是在 Mode 属性通过特性设置了默认的值是 Default 而如果设置默认的值是 Default 就会读取绑定的属性的对应的 FrameworkPropertyMetadata 是否有设置默认是双向

        [DefaultValue(BindingMode.Default)]

在 TextBlock 这些控件,有很多属性的绑定都是双向的,但是如果是小伙伴定义的控件,他可以定义出默认是双向绑定的或没有的

      public string TwoWay
{
get { return (string) GetValue(TwoWayProperty); }
set { SetValue(TwoWayProperty, value); }
} public static readonly DependencyProperty TwoWayProperty =
DependencyProperty.Register("TwoWay", typeof(string), typeof(MainWindow), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public string OneWay
{
get { return (string) GetValue(OneWayProperty); }
set { SetValue(OneWayProperty, value); }
} public static readonly DependencyProperty OneWayProperty =
DependencyProperty.Register("OneWay", typeof(string), typeof(MainWindow), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsArrange));

尝试再定义两个属性,绑定依赖属性

       public string Property1
{
get => _property;
set
{
_property = value;
OnPropertyChanged();
}
} public string Property2
{
get => _property2;
set
{
_property2 = value;
OnPropertyChanged();
}
} private string _property;
private string _property2; public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged([CallerMemberName]string name = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}

在构造函数绑定属性

       public MainWindow()
{
DataContext = this;
InitializeComponent(); Binding binding = new Binding
{
Path = new PropertyPath("Property1"),
Mode = BindingMode.Default
}; BindingOperations.SetBinding(this, TwoWayProperty, binding); binding = new Binding
{
Path = new PropertyPath("Property2"),
Mode = BindingMode.Default
}; BindingOperations.SetBinding(this, OneWayProperty, binding);
}

在界面绑定一下属性就知道属性是否修改

        <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Margin="10,10,10,10" Text="{Binding Property1}"></TextBlock>
<TextBlock Text="{Binding Property2}" Margin="10,10,10,10"></TextBlock>
<TextBlock x:Name="Text" Margin="10,10,10,10"></TextBlock>
<Button Content="修改值" Click="Button_Click"></Button>
</StackPanel>

界面的按钮点击的时候修改属性

        private void Button_Click(object sender, RoutedEventArgs e)
{
Random ran = new Random();
Text.Text = ran.Next().ToString();
OneWay = Text.Text;
TwoWay = Text.Text;
}

运行代码点击按钮,可以发现只有 Property1 会修改

所有代码在 github

建议只有在熟悉的属性才可以不写 Mode 防止翻车

Explain Binding Mode In WPF

BindingMode Enum (System.Windows.Data)

.net - What are the defaults for Binding.Mode=Default for WPF controls? - Stack Overflow

2019-4-12-WPF-绑定的默认模式的更多相关文章

  1. WPF绑定Binding及模式

    绑定,就是把一个对象属性的值绑定在别的对象的属性上 1. 默认绑定 public class Company { public string Name { get; set; } } XAML代码 1 ...

  2. WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参

    原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataC ...

  3. 日常Git使用——2019年12月11日16:19:03

    1.git介绍 1.1 什么是git? 什么是Git? 比如一个项目,两个人同时参与开发,那么就把这个项目放在一个公共的地方,需要的时候都可以去获取,有什么改动,都可以进行提交. 为了做到这一点,就需 ...

  4. WPF快速入门系列(4)——深入解析WPF绑定

    一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...

  5. WPF绑定功能常用属性介绍

    1.Mode 绑定中数据流的方向(enum BindingMode) 目标属性指的是控件的属性 (1)TwoWay 更改源属性或目标属性时,会自动更新另一方.适用于可编辑窗体 例:TextBox (2 ...

  6. 36.React基础介绍——2019年12月24日

    2019年12月24日16:47:12 2019年10月25日11:24:29 主要介绍react入门知识. 1.jsx语法介绍 1.1 介绍 jsx语法是一种类似于html标签的语法,它的作用相当于 ...

  7. 20.Nodejs基础知识(上)——2019年12月16日

    2019年12月16日18:58:55 2019年10月04日12:20:59 1. nodejs简介 Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触 ...

  8. 16.go语言基础学习(上)——2019年12月16日

    2019年12月13日10:35:20 1.介绍 2019年10月31日15:09:03 2.基本语法 2.1 定义变量 2019年10月31日16:12:34 1.函数外必须使用var定义变量 va ...

  9. AHKManager.ahk AHK管理器 2019年12月15日

    AHKManager.ahk  AHK管理器  2019年12月15日 快捷键   {Alt} + {F1} ///////////////////////////////////////////// ...

随机推荐

  1. React项目动态设置title标题

    在React搭建的SPA项目中页面的title是直接写在入口index.html中,当路由在切换不用页面时,title是不会动态变化的.那么怎么让title随着路由的切换动态变化呢?1.在定义路由时增 ...

  2. ThinkPHP5.0中报错could not find driver的解决方式

    这个报错是我的tp5项目转移到另外的服务器中发生的错误, 其中报错信息中还包含这pdo等字眼 解决方法:在php.ini中开启php_pdp_mysql.dll

  3. $.extend用法详解(一)

    jQuery.extend( target [, object1 ] [, objectN ] ) 在这里target是Object,它有两个作用: 1. 如果后面没有对应的object1及objec ...

  4. nodeJs koa-generator脚手架

    koa-generator 脚手架 全局安装:cnpm install -g koa-generator 查看版本:koa2 --version 创建项目:koa2 project 默认的是用jade ...

  5. jq方法的注意点

    当jq方法里面引用的ajax方法和其它方法时,就需要把ajax改为同步,通过ajax方法返回值来判断下一步执行那个方法,你不做判断,浏览器编译执行的时候不会不会按你想的从上之下执行下来. 当安卓手机跟 ...

  6. oracle loader

    控制文件的格式    load data    infile '数据文件名'    into table 表名    (first_name position(01:14) char,     sur ...

  7. Vue知识点——vue数据深拷贝方法

    背景 在vue页面传递数据的过程中,传递数据的引用地址并不会改变,所以当我们改变一些数据时,数据源 也会随之改变.可是有很多情景,我们改变传递的数据,并不需要源数据值发生变化,这时我们就需要对数据进行 ...

  8. Uva 10446【递推,dp】

    UVa 10446 求(n,bcak)递归次数.自己推出来了一个式子: 其实就是这个式子,但是不知道该怎么写,怕递归写法超时.其实直接递推就好,边界条件易得C(0,back)=1.C(1,back)= ...

  9. 线段树动态开点+树链剖分BZOJ4999

    以每个一个颜色开一颗线段树,内部以dfs序作为线段树节点,权值代表出现次数,维护线段树区间和 #include<iostream> #include<stdio.h> #inc ...

  10. 2019-3-25-win10-uwp-如何将像素数组转-png-文件

    title author date CreateTime categories win10 uwp 如何将像素数组转 png 文件 lindexi 2019-3-25 8:53:1 +0800 201 ...