Я вывел класс под названием "ConfExtension" из Binding. В двух словах это выглядит так:

Public Class ConfExtension
    Inherits Binding

    Public Sub New(path As String)
        MyBase.New(path)
        ...
    End Sub

    ...

    Public Property DefaultValue As Object
End Class

В XAML я использую этот класс следующим образом:


Как я могу получить доступ к целевому объекту привязки (в данном случае к окну) из метода в моем классе?

EDIT: Из моего исследования это кажется чем-то средним между сложным и невозможным. Итак, вот чего я в конечном итоге хочу добиться:

Расширение ConfExtension должно стать простым способом хранения и получения настроек для элементов управления WPF. Путь привязки является ключом хранения, и пока все работает нормально:


    ...

Это позволяет мне хранить и извлекать конфигурацию окна, сохраняя все значения в виде строк. Но дальше по визуальному дереву я могу захотеть повторно использовать те же ключи (на самом деле я даже не буду знать, какие ключи были использованы) для некоторых других конфигурационных свойств-связей. Вот почему мне пришла в голову идея создать несколько вложенных свойств для целевого элемента, которые помогут мне определить (и в конечном итоге сгруппировать) настройки для соответствующего элемента.


    ...

(Класс с привязанными свойствами называется Conf, а класс, который работает с привязкой, называется ConfExtension, оба находятся в пространстве имен "imCC", таким образом, в разметке используется одинаковая нотация "imCC:Conf")

Моя идея заключалась в том, чтобы двигаться вверх по визуальному дереву от элемента, который получает привязку "конфигурации", взять следующий "Conf.ID" и использовать его в качестве префикса (или аналогичным образом) для идентификации соответствующих настроек.

Если окажется, что я не могу получить Цель только этим методом, есть ли другие способы добиться этого? Я наткнулся на BindingGroupName - это хлебная крошка, по которой нужно идти?

themightylc

Ответов: 1

Ответы (1)

Кратко говоря, ответ заключается в том, чтобы наследоваться не от Binding, а от MarkupExtension и привести serviceProvider к IProvideValueTarget.

Я обернул свой предыдущий код в другой ExtensionClass, и это достигло того, чего я хотел в своем первоначальном вопросе (прежде всего, получить доступ к TargetObject)

.
Public Class Conf2Extension
    Inherits Markup.MarkupExtension

    Private _MyName As String
    Public Sub New(MyName As String)
        MyBase.New
        _MyName = MyName
    End Sub

    Public Overrides Function ProvideValue(serviceProvider As IServiceProvider) As Object
        Dim x As IProvideValueTarget = CType(serviceProvider, IProvideValueTarget)
        Dim TargetObject As DependencyObject = CType(x.TargetObject, DependencyObject)
        Dim TargetProperty As DependencyProperty = CType(x.TargetProperty, DependencyProperty)

        Dim MyConfBinding As New ConfExtension(_MyName) With {.DefaultValue = "This Works!"}
        Return MyConfBinding.ProvideValue(serviceProvider)
    End Function
End Class

2022 WebDevInsider