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. Vue项目根据不同运行环境打包项目

    前提 项目是直接通过 vue-cli脚手架 生成的: 假设在项目开发中,分为三个环境 -- · 测试环境· 预生产环境· 生产环境 每个环境的接口地址都是不同的,而 vue-cli 给出的环境只有 d ...

  2. c标签 if else c标签 总结

    [b]STL标签用法 关键字:JSTL标签.<c:choose>.<c:forEach>.<c:forTokens>.<c:if>.<c:impo ...

  3. oracle国家字符集

    国家字符集是一个备用字符集,利用此字符集可以在没有Unicode 数据库字符集的数据库中存储 Unicode 字符. 选择国家字符集的其它原因如下: 对于频繁的字符处理操作,不同的字符编码方案可能更为 ...

  4. 阿里云MVP北京闭门会圆满落幕 多把“利剑”助力开发者破阵蜕变

    摘要: 从传统制造业到新零售,从人工智能到新金融,阿里云MVP正在成为中国乃至全球各行各业数字化转型的中坚力量.当这群技术先锋者与阿里核心技术力量汇聚在一起,一场无与伦比的思想碰撞就此展开. 3月21 ...

  5. LintCode_408 二进制求和

    给定两个二进制字符串,返回他们的和(用二进制表示). 思路 string s = ""; 目标字符串 cp 存储进位;取 0或1 sum = a[i] + b[i] + cp;分为 ...

  6. golang数据类型二

    字符类型 3.14基本数据类型的相互转换 3.15基本数据类型和string的转换 FormatInt // FormatUint 将 int 型整数 i 转换为字符串形式// base:进位制(2 ...

  7. 面向视频的全新AI架构 —— 阿里云智能视觉技术全解

    我们都知道,AI技术正在以可见的速度被应用于各行各业,然而绝大部分业务场景想应用AI技术,都需要算法工程师根据自身业务的标注数据,来进行单独训练,才能打磨出合适的AI模型.如此一来,如何以最低的门槛和 ...

  8. Hbuilder的使用技巧

    /*注:本教程针对HBuilder5.0.0,制作日期2014-12-31*/创建HTML结构: h 8 (敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲h t Enter)中途换行 ...

  9. 国内 PHP Composer 镜像列表(2019-07-07)

    目录 国内 PHP Composer 镜像列表 Composer 是什么? 镜像列表 配置镜像 本文历史 参考 国内 PHP Composer 镜像列表 Composer 是什么? Composer ...

  10. mysql列转行 行转列

    列转行 SELECT flag ,substring_index(substring_index(t.context,), ) as result FROM ( select 'aa' as flag ...