c# - 当属性网格的属性值更改时防止对象修改
问题描述
我继承了FileSystemInfo类来实现一个名为ShortcutFileInfo的类,它将代表一个快捷方式 (.lnk) 文件。
我通过一个属性网格(Windows 窗体项目)来表示这个类,如下所示:
现在,因为我的实现就像FileInfo对象的普通实例一样工作,这意味着当设置任何属性时,setter 会修改文件内容,例如在设置此属性以更改文件属性时:
<Description("The file attributes of the current shortcut file.")>
<DisplayName("Attributes")>
<Category("File Info Extended")>
Public Shadows Property Attributes As FileAttributes
Get
Return MyBase.Attributes
End Get
Set(value As FileAttributes)
If (value <> MyBase.Attributes) Then
MyBase.Attributes = value
End If
End Set
End Property
或者这个其他属性来设置快捷方式描述:
<Description("The shortcut description.")>
<DisplayName("Description")>
<Category("Shortcut")>
Public Property Description As String
Get
Return Me.description_
End Get
Set(value As String)
If (value <> Me.description_) Then
Me.description_ = value
Me.WriteLink()
End If
End Set
End Property
Private description_ As String
(注意对Me.WriteLink()
方法的调用,它将修改写入快捷方式文件。)
这是我实现的行为,因为它是我所期望的,它与使用常规 FileInfo/DirectoryInfo 类时相同,而不是实现一种“SaveFile”方法......
但是,这是一个特殊的场景,我想阻止这种行为,因为我在视觉上表示类属性,并且当我修改属性网格中任何属性的值时,它会修改快捷方式文件,我认为它对快捷方式文件进行了太多不必要的写入操作...
相反,我会让最终用户能够更改用户界面中的任何值,而无需不断重写快捷方式文件,并且只需使用一种“保存”按钮来应用对快捷方式文件所做的更改,当他准备好了。
我的问题是:在 C# 或 VB.NET 中,在不修改我的ShortcutFileInfo类的实现的情况下,这将是实现这一目标的好方法?(属性设置器)。我的意思是,如何让最终用户在不触发加载对象的属性设置器的情况下编辑属性网格中的任何属性?改变了。
也许可以通过PropertyGrid.PropertyValueChanged
活动完成某些事情,但我不确定是什么以及如何做。
我能想到的唯一也是最平庸的解决方案是,当我要在属性网格中加载ShortcutFileInfo对象时,创建该对象的副本,路径指向系统的临时目录,然后将该对象加载到属性网格。这样原来的快捷方式文件不会被修改,但是系统临时目录下创建的临时快捷方式文件会被修改,所以这确实解决不了主要问题。
如果有助于更好地理解它,这就是我创建快捷方式文件并将其加载到属性网格中的方法:
Dim lnk As New ShortcutFileInfo("C:\Test Shortcut.lnk")
lnk.Create()
' Deletes FileAttributes.ReadOnly attribute from file, like FileInfo class does.
lnk.IsReadOnly = False
With lnk
.Attributes = FileAttributes.System
.Description = "My shortcut file description"
.Hotkey = Keys.Shift Or Keys.Alt Or Keys.Control Or Keys.F1
.Icon = "Shell32.dll"
.IconIndex = 0
.Target = "C:\Target.exe"
.TargetArguments = "/arg1 /arg2"
.WindowState = ShortcutWindowState.Normal
.WorkingDirectory = Path.GetDirectoryName(lnk.Target)
End With
' Adds FileAttributes.ReadOnly attribute to file, like FileInfo class does.
lnk.IsReadOnly = True
Me.PropertyGrid1.SelectedObject = lnk
请注意,当lnk
对象的任何属性被设置时,快捷方式文件将被重写。正如预期的那样。
解决方案
推荐阅读
- javascript - Chart.js - 当浏览器语言不是英语时,x 轴和工具提示标签在 Chrome 中显示“未定义”
- php - simplexml 使用带有 xpathnamespace 的 xpath 查找节点的值 - 未定义的偏移量:0
- node.js - AWS SQS 将消息发送到无服务器离线队列工作,但在部署时不发送 AWS 服务器
- php - 今天的日期 strtotime 显示昨天的日期在 23:59:59 之后没有改变
- javascript - 删除坐标列表中几乎相同的值
- java - 如何在 JDK 1.7 上将 GMT 日期时间 SQL 数据类型转换为 JAVA EST 时间戳
- android - 使用 Kotlin 进行“已解决”的改造不会触发入队
- java - 如何使用 Firefox 的 selenium Webdriver 处理 Shadow-dom 元素
- c - 无法获取 HiRedis TLS example-ssl 进行连接
- python - 我试图限制用户可以尝试的次数,但它只是无限期地输出。有人可以帮助我吗?(Python)