WPF:从派生绑定类

时间:2016-01-01 12:28:43

标签: .net wpf vb.net data-binding

我从Binding派生了一个名为“ConfExtension”的类。简而言之,它看起来像这样:

Public Class ConfExtension
    Inherits Binding

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

    ...

    Public Property DefaultValue As Object
End Class

在XAML中,我按如下方式使用此类:

<Window x:Class="MainWindow"
    ...
    Height="{local:Conf Height,DefaultValue=480}"/>

如何从类中的方法访问绑定的目标对象(在本例中是窗口)?

编辑:从我的研究来看,这似乎有点棘手和不可能。所以这就是我最终想要实现的目标:

ConfExtension应该是存储和检索WPF控件设置的简单方法。绑定路径是存储密钥,它到目前为止工作正常:

<Window x:Class="MainWindow"
    ...
    Height="{imCC:Conf Height,DefaultValue=480}"
    Width="{imCC:Conf Width,DefaultValue=640}"
    Left="{imCC:Conf Left, DefaultValue=0}"
    Top="{imCC:Conf Top, DefaultValue=0}"
    WindowState="{imCC:Conf WindowState,DefaultValue=Normal}"
           >
    ...
</Window>

这是让我通过将所有值保存为字符串来存储和检索Window配置。但是在可视化树的下方,我可能想要重用相同的键(实际上我甚至不知道已经使用了哪些键)用于其他一些配置属性绑定。这就是为什么我想出了一个想法,在目标元素上创建一些附加属性,这将有助于我识别(并最终组合在一起)相应元素的设置。

<Window x:Class="MainWindow"
    ...

    imCC:Conf.ID="A6236826-9B21-4EFB-BFA4-66C1661E22D7"
    imCC:Conf.Section="Fenstereinstellungen"

    Height="{imCC:Conf Height,DefaultValue=480}"
    Width="{imCC:Conf Width,DefaultValue=640}"
    Left="{imCC:Conf Left, DefaultValue=0}"
    Top="{imCC:Conf Top, DefaultValue=0}"
    WindowState="{imCC:Conf WindowState,DefaultValue=Normal}"
           >
    ...
</Window>

(具有附加属性的类称为Conf,而用于绑定的类称为ConfExtension,两者都在命名空间“imCC”中,因此标记“imCC:Conf”中的符号相同)

我的想法是从可获得我的“配置”绑定的元素向前移动Visual Tree,抓住下一个“Conf.ID”并将其用作前缀(或以类似方式)来识别相应的设置

如果单独使用此方法无法获得目标,是否还有其他方法可以实现此目的?我偶然发现了BindingGroupName - 这是一个跟随面包屑吗?

1 个答案:

答案 0 :(得分:0)

简而言之,答案不是从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