首页 > 解决方案 > 当属性网格的属性值更改时防止对象修改

问题描述

我继承了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对象的任何属性被设置时,快捷方式文件将被重写。正如预期的那样。

标签: c#.netvb.netwinformspropertygrid

解决方案


推荐阅读