本文记录 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 里对非公开设置的属性进行写入也是非预期的,抛出异常符合设计

本文所有代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 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 行为的不同的更多相关文章

  1. C# Wpf双向绑定实例

    Wpf中双向绑定处理需要两处 实例1: 1.前台Xaml中属性Binding 时Model指定 TwoWay <Grid> <Ellipse x:Name="ellipse ...

  2. WPF双向绑定

    需求: 思想批量保存数据. 思路: 看了一下MVVM.发现只需要实现前台和后台数据的同步即可.也就是前台的文本框内容变化时后台的对象的属性也要变化就可以了. 参考: http://www.cnblog ...

  3. MVVMLight学习笔记(三)---数据双向绑定

    一.概述 本文与其说是MVVMLight框架的学习,不如说是温故一下数据的双向绑定. 二.Demo 建立好MVVMLight框架后的Wpf工程后,建立一个Model.Model.View以及ViewM ...

  4. 探索模拟angular的双向绑定

    前言 本次探索的demo是基于jquery写的,毕竟jquery提供了强大的选择器,用惯了就离不开它了!angular的双向绑定实在是有点精深,本次探索只实现了文本的双向绑定. View-Model ...

  5. AngularJs双向绑定详解

    双向绑定的三个重要方法: $scope.$apply() $scope.$digest() $scope.$watch() 一.$scope.$watch() 我理解的$watch就是将对某个数据的监 ...

  6. vue的双向绑定原理浅析与简单实现

    很久之前看过vue的一些原理,对其中的双向绑定原理也有一定程度上的了解,只是最近才在项目上使用vue,这才决定好好了解下vue的实现原理,因此这里对vue的双向绑定原理进行浅析,并做一个简单的实现. ...

  7. vue 中contenteditable="true"添加可编辑属性后v-model双向绑定失效的解决办法

    在项目中会遇到需要编辑单元格的双向绑定问题,v-model双向绑定会在添加contenteditable="true"属性后失效解决方法如下,亲测好用(v-html和@blur实现 ...

  8. C# Wpf集合双向绑定

    说明: msdn中   ObservableCollection<T> 类    表示一个动态数据集合,在添加项.移除项或刷新整个列表时,此集合将提供通知. 在许多情况下,所使用的数据是对 ...

  9. WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了

    原文:WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4 ...

  10. 如何在双向绑定的Image控件上绘制自定义标记(wpf)

    我们的需求是什么? 答:需要在图片上增加一些自定义标记,例如:2个图片对比时,对相同区域进行高亮. 先上效果图: 设计思路 1.概述 1.通过TargeUpdated事件,重新绘制图片进行替换. 2. ...

随机推荐

  1. XSS 从 PDF 中窃取数据

    XSS 从 PDF 中窃取数据 将服务器端 XSS 注入到动态生成的 PDF 中 在 hack the box 的 Book 机器(Scripting Track)上,我遇到了一个 Web 应用程序, ...

  2. CMake使用Boost

    cmake_minimum_required(VERSION 2.8) set(Boost_INCLUDE_DIR /usr/local/src/boost_1_46_1) set(Boost_LIB ...

  3. OpenHarmony嵌套类对象属性变化:@Observed装饰器和@ObjectLink装饰器

    上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型.对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第 ...

  4. 踩坑指南:入门OpenTenBase之部署篇

    引言 OpenTenBase 企业级分布式HTAP开源数据库,具备高扩展性.商业数据库语法兼容.分布式HTAP引擎.多级容灾和多维度资源隔离等能力,成功应用在金融.医疗.航天等行业的核心业务系统. 这 ...

  5. openGauss关于PL/SQL匿名块调用测试

    openGauss 关于 PL/SQL 匿名块调用测试 一.原理介绍 PL/SQL(Procedure Language/Structure Query Language)是标准 SQL 语言添加了过 ...

  6. opencv读取中文路径图片

    点击查看代码 img = cv2.imdecode(np.fromfile(filename, dtype=np.uint8), cv2.IMREAD_GRAYSCALE)

  7. 一、Unity调用Xcode封装方法(工程引用文件)

    1.Xcode新建Static Library 工程 (我起的名字是UnityExtend 可以在接下来的图中看到) 2.打包unity ios工程 unity打包ios 打出Xcode工程 3.打开 ...

  8. "鸿蒙生态专家面对面"三月专场等你前来!

  9. SSH的密码qsnctfwp

    开启 kali,在终端输入ssh root@challenge.qsnctf.com -p [port]可以访问远程 SSH 系统 根据提供的 passlist.txt 文件内容进行密码爆破 编写 S ...

  10. Mui 消息推送

    一.push通过H5+实现 简单实现方式:通过轮询服务器是否有新消息推送过来 mui.plusReady(function() {plus.navigator.closeSplashscreen(); ...