WPF 双向绑定到非公开 set 方法属性在 NET 45 和 NET Core 行为的不同
本文记录 WPF 在 .NET Framework 4.5 和 .NET Core 3.0 或更高版本对使用 Binding 下的 TwoWay 双向绑定模式绑定到非公开的 set 属性上的行为变更
在 .NET Framework 4.5 下,可以使用 Binding 下的 TwoWay 双向绑定模式,绑定到非公开的 set 属性,如 private set 私有设置的属性上,实现双向更改,效果上和公开的 set 方法一样,可以成功写入
但是在 .NET Core 3.0 开始,此绑定将会提示 XamlParseException 而抛出异常
如以下的 ViewModel 代码,包含了一个 Name 属性,此属性的 set 方法是私有的
class ViewModel : INotifyPropertyChanged
{
public string Name
{
get => _name;
private set
{
_name = value;
OnPropertyChanged();
}
}
private string _name;
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
在 XAML 使用如下代码双向绑定,期望在 TextBox 输入的内容可以写入到 Name 属性
<TextBox Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
以上代码是能在 .NET Framework 4.5 如预期工作。然而在 .NET Core 3.0 或更高版本,将会抛出异常
System.Windows.Markup.XamlParseException: '“设置属性“System.Windows.Controls.TextBox.Text”时引发了异常。”'
InvalidOperationException: 无法对“GogeeceldeaLabacheleabe.ViewModel”类型的只读属性“Name”进行 TwoWay 或 OneWayToSource 绑定。
对应的英文异常如下
System.InvalidOperationException: 'A TwoWay or OneWayToSource binding cannot work on the read-only property 'Name' of type 'GogeeceldeaLabacheleabe.ViewModel'.'
根据 WPF: After Visual Studio 2017 Update, "A TwoWay or OneWayToSource binding cannot work on the read-only property" - Visual Studio Feedback 的描述,其实这是 .NET Framework 4.5 的坑,在 .NET Framework 4.7 就修复了。经过我的考古,在 .NET Framework 4.6 下的行为就和 .NET Core 3.0 版本相同,是会抛出异常
敲黑板,使用双向绑定到非公开 set 方法的属性上的行为变更,不是 .NET Framework 和 .NET Core 的差别行为变更,而仅仅是 .NET Framework 4.5 和后续版本的差别
以下是原文:
So, this was a BUG in framework V4.5, when most of the code was written, and "FIXED" in V4.7
在 WPF 官方从 .NET Framework 拷贝代码到 .NET Core 开源时,也遇到此坑,请看 Removed HandleTwoWayBindingToPropertyWithNonPublicSetter compat flag by ojhad · Pull Request #1502 · dotnet/wpf
Two-way binding to properties with non-public setters was being allowed because we took on behavior that was caused by a bug in .NET Framework 4.5. Back then, a compatibility flag was introduced due to this 4.5 bug. We no longer want to support this scenario because we want correct behavior in .NET Core and we want the behavior to be on parity with net472/8. So there is no longer need for the compat flag.
在 .NET Core 3.0 的更新里,也提到了这个坑,参阅 August Update for WPF on .NET Core 3.0 · Issue #1731 · dotnet/wpf
此问题我也报告给官方,请看 Binding non-public property behavior changed between dotnet core 3.1 and net45 · Issue #5923 · dotnet/wpf
我认为,如果 ViewModel 设置了属性的 set 为私有,那也就是从设计上不要让其他逻辑进行设置,自然在 XAML 里对非公开设置的属性进行写入也是非预期的,抛出异常符合设计
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 01bb068fd7f714313e44cdbcfdf5d0b5630f1bac
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
获取代码之后,进入 GogeeceldeaLabacheleabe 文件夹
WPF 双向绑定到非公开 set 方法属性在 NET 45 和 NET Core 行为的不同的更多相关文章
- C# Wpf双向绑定实例
Wpf中双向绑定处理需要两处 实例1: 1.前台Xaml中属性Binding 时Model指定 TwoWay <Grid> <Ellipse x:Name="ellipse ...
- WPF双向绑定
需求: 思想批量保存数据. 思路: 看了一下MVVM.发现只需要实现前台和后台数据的同步即可.也就是前台的文本框内容变化时后台的对象的属性也要变化就可以了. 参考: http://www.cnblog ...
- MVVMLight学习笔记(三)---数据双向绑定
一.概述 本文与其说是MVVMLight框架的学习,不如说是温故一下数据的双向绑定. 二.Demo 建立好MVVMLight框架后的Wpf工程后,建立一个Model.Model.View以及ViewM ...
- 探索模拟angular的双向绑定
前言 本次探索的demo是基于jquery写的,毕竟jquery提供了强大的选择器,用惯了就离不开它了!angular的双向绑定实在是有点精深,本次探索只实现了文本的双向绑定. View-Model ...
- AngularJs双向绑定详解
双向绑定的三个重要方法: $scope.$apply() $scope.$digest() $scope.$watch() 一.$scope.$watch() 我理解的$watch就是将对某个数据的监 ...
- vue的双向绑定原理浅析与简单实现
很久之前看过vue的一些原理,对其中的双向绑定原理也有一定程度上的了解,只是最近才在项目上使用vue,这才决定好好了解下vue的实现原理,因此这里对vue的双向绑定原理进行浅析,并做一个简单的实现. ...
- vue 中contenteditable="true"添加可编辑属性后v-model双向绑定失效的解决办法
在项目中会遇到需要编辑单元格的双向绑定问题,v-model双向绑定会在添加contenteditable="true"属性后失效解决方法如下,亲测好用(v-html和@blur实现 ...
- C# Wpf集合双向绑定
说明: msdn中 ObservableCollection<T> 类 表示一个动态数据集合,在添加项.移除项或刷新整个列表时,此集合将提供通知. 在许多情况下,所使用的数据是对 ...
- WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了
原文:WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4 ...
- 如何在双向绑定的Image控件上绘制自定义标记(wpf)
我们的需求是什么? 答:需要在图片上增加一些自定义标记,例如:2个图片对比时,对相同区域进行高亮. 先上效果图: 设计思路 1.概述 1.通过TargeUpdated事件,重新绘制图片进行替换. 2. ...
随机推荐
- 工良出品,从零设计开发 .NET 开发框架:框架源码和教程电子书
为什么要写这个教程 在毕业之后,读者写过了大量的文章和开源项目,正是坚持一边学习一边输出,所以笔者最终从一个生菜鸡进化为一个熟菜鸡. 在程序员的成长中,我们会在思路,如何学习.如何进步,比如要成长为一 ...
- Button按钮Effect的用法
教大家写一个好看的Button按钮 代码简单粗暴 <Grid > <Border Width="200" Height="30" Margin ...
- Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 开始之前 Composition API 可以说是Vue3的最大特点,那么为什么要推出Composition Api,解决了什么问题? 通 ...
- 记录--前端路由 hash 与 history 差异
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 简单介绍 Vue Router Vue Router 是 Vue.js 官方的路由插件,它和 Vue.js 是深度集成的,适合用于构建单页 ...
- 记录-VueJs中如何使用Teleport组件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在DOM结构相对比较复杂,层级嵌套比较深的组件内,需要根据相对应的模块业务处理一些逻辑,该逻辑属于当前组件 但是从整个页面应用的视图上看, ...
- DW:优化目标检测训练过程,更全面的正负权重计算 | CVPR 2022
论文提出自适应的label assignment方法DW,打破了以往耦合加权的惯例.根据不同角度的一致性和非一致性指标,动态地为anchor分配独立的pos权重和neg权重,可以更全面地监督训练.此外 ...
- 面试官:Session和JWT有什么区别?
Session 和 JWT(JSON Web Token)都是用于在用户和服务器之间建立认证状态的机制,但它们在工作原理.存储方式和安全性等方面存在着一些差异,下面我们一起来看. 1.什么是JWT? ...
- C# 继承、多态性、抽象和接口详解:从入门到精通
C# 继承 在 C# 中,可以将字段和方法从一个类继承到另一个类.我们将"继承概念"分为两类: 派生类(子类) - 从另一个类继承的类 基类(父类) - 被继承的类 要从一个类继承 ...
- SQL 中的 MIN 和 MAX 以及常见函数详解及示例演示
SQL MIN() 和 MAX() 函数 SQL中的MIN()函数和MAX()函数用于查找所选列的最小值和最大值,分别.以下是它们的用法和示例: MIN() 函数 MIN()函数返回所选列的最小值. ...
- 品质影音体验,畅享娱乐生活丨HMS Core.Sparkle影音娱乐创新线上沙龙报名启动
从全民娱乐到全民创作,音视频.直播已成为文娱市场中最为活跃的内容形态,用户在享受视听娱乐的同时,也更期待通过这些平台来表达自己. 面对用户个性化需求的增加,影音娱乐应用开发者和内容平台,该如何通过技术 ...