【问题标题】:WPF: Get Target Object from derived Binding ClassWPF:从派生的绑定类中获取目标对象
【发布时间】:2016-01-01 12:28:43
【问题描述】:

我从 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 控件设置的简单方法。 Binding 路径是存储键,目前运行良好:

<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”中的符号相同)

我的想法是从获取我的“配置”绑定的元素在可视树中向上移动,获取下一个“Conf.ID”并将其用作前缀(或以类似方式)以识别相应的设置.

如果我无法单独通过这种方法获得Target,还有其他方法可以实现吗?我偶然发现了 BindingGroupName - 这是要遵循的面包屑吗?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2012-09-09
      • 2012-05-03
      • 1970-01-01
      • 2011-01-11
      相关资源
      最近更新 更多