2019-4-12-WPF-绑定的默认模式
| 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 防止翻车
BindingMode Enum (System.Windows.Data)
.net - What are the defaults for Binding.Mode=Default for WPF controls? - Stack Overflow
2019-4-12-WPF-绑定的默认模式的更多相关文章
- WPF绑定Binding及模式
绑定,就是把一个对象属性的值绑定在别的对象的属性上 1. 默认绑定 public class Company { public string Name { get; set; } } XAML代码 1 ...
- WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参
原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataC ...
- 日常Git使用——2019年12月11日16:19:03
1.git介绍 1.1 什么是git? 什么是Git? 比如一个项目,两个人同时参与开发,那么就把这个项目放在一个公共的地方,需要的时候都可以去获取,有什么改动,都可以进行提交. 为了做到这一点,就需 ...
- WPF快速入门系列(4)——深入解析WPF绑定
一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...
- WPF绑定功能常用属性介绍
1.Mode 绑定中数据流的方向(enum BindingMode) 目标属性指的是控件的属性 (1)TwoWay 更改源属性或目标属性时,会自动更新另一方.适用于可编辑窗体 例:TextBox (2 ...
- 36.React基础介绍——2019年12月24日
2019年12月24日16:47:12 2019年10月25日11:24:29 主要介绍react入门知识. 1.jsx语法介绍 1.1 介绍 jsx语法是一种类似于html标签的语法,它的作用相当于 ...
- 20.Nodejs基础知识(上)——2019年12月16日
2019年12月16日18:58:55 2019年10月04日12:20:59 1. nodejs简介 Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触 ...
- 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 ...
- AHKManager.ahk AHK管理器 2019年12月15日
AHKManager.ahk AHK管理器 2019年12月15日 快捷键 {Alt} + {F1} ///////////////////////////////////////////// ...
随机推荐
- Centos7.2源码编译安装LA(N)MP
LAMP环境中php是作为apache的模块安装的,所以安装顺序是php放在apache的后面安装,这样便于安装php时可以在apache的模块目录生成对应的php模块. apache版本:2.4.3 ...
- Tool-图片压缩-腾讯智图:腾讯智图
ylbtech-Tool-图片压缩-腾讯智图:腾讯智图 智图是腾讯ISUX前端团队开发的一个专门用于图片压缩和图片格式转换的平台,其功能包括针对png,jpeg,gif等各类格式图片的压缩,以及为上传 ...
- fedora下eclipse安装tomcat插件
首先下载tomcat插件: http://www.eclipsetotale.com/tomcatPlugin.html,下载最新的3.3版本: 由于我的eclipse是通过yum自动安装的,因此ec ...
- Nginx教程(五) Nginx配置文件详解 (转)
一. Nginx配置文件nginx.conf中文详解 #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processe ...
- input输入框限制录入类型
输入大小写字母.数字.下划线:<input type="text" onkeyup="this.value=this.value.replace(/[^\w_]/g ...
- Codeforces 432C
题目链接 题意: 给出一个长度为n(n<=10^5)的数组a, 数组a是数字1到n的一种排列(打乱顺序). 每次可以选择两个数(不同)进行交换, 但是交换的条件是被选择的两个数的下标之差加1应 ...
- springboot 启动配置原理【转】【补】
创建应用 几个重要的事件回调机制 , 配置在META-INF/spring.factories ApplicationContextInitializer SpringApplicationRunL ...
- nodeJs学习-15 mysql中间件下载与使用、基本用法
下载mysql中间件(客户端):cnpm install mysql 链接数据库.查询示例: const mysql=require('mysql'); //1.连接 //createConnecti ...
- 中文乱码在java中URLEncoder.encode方法要调用两次解决
中文乱码在java中URLEncoder.encode方法要调用两次解决 一.场景: 1.我在客户端要通过get方式调用服务器端的url,将中文参数做utf-8编码,需要在js中两次的进行编码,服务器 ...
- jq 获取内容
1.html()-设置或者返回被选元素的内容(包括html标记) $(selector).html() 2.text()-设置或者返回被选元素的内容 $(selector).text() 3.val( ...