Запретить изменение объекта при изменении значения свойства сетки свойств - PullRequest
1 голос
/ 26 мая 2019

Я унаследовал класс FileSystemInfo для реализации класса с именем ShortcutFileInfo , который будет представлять файл ярлыка (.lnk).

И я представляюКласс через сетку свойств (проект Windows Forms), например:

enter image description here

Теперь, потому что моя реализация работает как обычный экземпляр FileInfo объект, в том смысле, что когда любое из свойств установлено, установщик изменяет содержимое файла, как, например, при установке этого свойства для изменения атрибутов файла:

<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» ...

Однако это особыйCenario, в котором я хочу предотвратить это поведение, потому что я представляю свойства класса визуально, и когда я изменяю значение любого свойства в сетке свойств, он изменяет файл ярлыка, и я считаю, что это слишком много ненужных операций записи, чтобыфайл ярлыка ...

Вместо этого я позволю конечному пользователю иметь возможность изменять любые значения в пользовательском интерфейсе, не перезаписывая файл ярлыка постоянно, и просто использовать вид «Сохранить».кнопку, чтобы применить изменения, внесенные в файл ярлыка, когда он будет готов.


Мой вопрос: в C # или VB.NET, что было бы хорошим подходом для достижения этой цели, без изменения реализациимой ShortcutFileInfo класс?(свойства установщиков).Я имею в виду, как я могу позволить конечному пользователю редактировать любое свойство в сетке свойств, не вызывая установщик свойств загруженного объекта? Или что-то еще, чтобы предотвратить изменение файла ярлыка, когда значение свойства в сетке свойствизменилось.

Может быть, что-то можно сделать с помощью события PropertyGrid.PropertyValueChanged, но я не уверен, что и как.

Единственное и самое посредственное решение, которое я могу придумать, эточто, когда я собираюсь загрузить объект ShortcutFileInfo в сетке свойств, создайте копию этого объекта с путем, указывающим на временный каталог системы, и загрузите этот объект в PropertyGrid.Таким образом, исходный файл ярлыка не будет изменен, но будет изменен временный файл ярлыка, созданный во временном каталоге системы, так что это действительно не решит основную проблему.


Если полезно разобраться в этомлучше, это то, что я делаю, чтобы создать файл ярлыка и загрузить его в сетку свойств:

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, файл ярлыка повторно-written.Как и ожидалось.

...