我从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 - 这是一个跟随面包屑吗?
答案 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