WPF绑定源

WPF绑定源,wpf,vb.net,xaml,Wpf,Vb.net,Xaml,我找了一个多星期的答案,但是找不到 由于某些原因,我必须实现我自己的Windows.Data.Binding。因此,我创建了一个类,并在其中放置了一个私有绑定对象,如下所示: Public Class Binding Inherits MarkupExtension Private _Binding As New Windows.Data.Binding #Region "Properties" Public Property ElementName() As String Get

我找了一个多星期的答案,但是找不到

由于某些原因,我必须实现我自己的
Windows.Data.Binding
。因此,我创建了一个类,并在其中放置了一个私有
绑定
对象,如下所示:

Public Class Binding
Inherits MarkupExtension
Private _Binding As New Windows.Data.Binding

#Region "Properties"

Public Property ElementName() As String
    Get
        Return _Binding.ElementName
    End Get
    Set(value As String)
        _Binding.ElementName = value
    End Set
End Property

Public Property Mode() As BindingMode
    Get
        Return _Binding.Mode
    End Get
    Set(value As BindingMode)
        _Binding.Mode = value
    End Set
End Property

Public Property Source() As Object
    Get
        Return _Binding.Source
    End Get
    Set(value As Object)
        _Binding.Source = value
    End Set
End Property
#End Region
'*Other Properties of Windows.Data.Binding go inside region*

Public Overrides Function ProvideValue(serviceProvider As IServiceProvider) As Object
    If serviceProvider Is Nothing Then
        Return "Design Time"
    Else
        Dim k = _Binding.ProvideValue(serviceProvider)
        Return k
    End If
End Function
End Class
<TextBlock Text={local:Binding Path=UserID} />
成功了。 我需要更改
ProvideValue
中的一些实现,为此,我需要找到绑定的来源。例如,我在XAML中有一个对象,如下所示:

Public Class Binding
Inherits MarkupExtension
Private _Binding As New Windows.Data.Binding

#Region "Properties"

Public Property ElementName() As String
    Get
        Return _Binding.ElementName
    End Get
    Set(value As String)
        _Binding.ElementName = value
    End Set
End Property

Public Property Mode() As BindingMode
    Get
        Return _Binding.Mode
    End Get
    Set(value As BindingMode)
        _Binding.Mode = value
    End Set
End Property

Public Property Source() As Object
    Get
        Return _Binding.Source
    End Get
    Set(value As Object)
        _Binding.Source = value
    End Set
End Property
#End Region
'*Other Properties of Windows.Data.Binding go inside region*

Public Overrides Function ProvideValue(serviceProvider As IServiceProvider) As Object
    If serviceProvider Is Nothing Then
        Return "Design Time"
    Else
        Dim k = _Binding.ProvideValue(serviceProvider)
        Return k
    End If
End Function
End Class
<TextBlock Text={local:Binding Path=UserID} />

好的,我的
TextBlock
绑定到
UserID
什么…

问题是绑定的来源是什么?我如何在
ProvideValue
方法中访问它?


多亏了大家

这里有一个示例,介绍如何使用服务提供商获取绑定的目标和来源

Public Overrides Function ProvideValue(serviceProvider As IServiceProvider) As Object
    Dim service As IProvideValueTarget = DirectCast(serviceProvider.GetService(GetType(IProvideValueTarget)), IProvideValueTarget)
    Dim targetObject As DependencyObject = TryCast(service.TargetObject, DependencyObject)
    Dim targetProperty As DependencyProperty = TryCast(service.TargetProperty, DependencyProperty)

    'find source of the binding'
    Dim targetElement As FrameworkElement = TryCast(targetObject, FrameworkElement)
    If targetElement IsNot Nothing Then
        Dim sourceObject As Object = targetElement.DataContext

        'your logic here'
    End If
End Function
我建议,只有当您无法使用转换器和格式实现相同的绑定扩展,并且有特定需要时,才创建自己的绑定扩展


阅读此处了解有关IServiceProvider的更多信息

我想知道为什么您需要实现自己的绑定,您可以使用转换器、格式字符串等。这是一个想法。我正在编写一个公共DLL,它将在该公司的所有项目上共享,假设每个项目中都有几个项目和几个用户
UserAccess
。我想限制用户对表的特定列的访问,因此,我不想让其他开发人员急于采用这种策略,他们只是绑定到适当的表和适当的列,但是**Myy**
Binding
决定该用户是否可以读取这些值!我不知道我是否能说清楚:/谢谢你花时间,也许我无法形容得更好。但是
targetProperty
TextBlock
Text
属性,其中
targetObject
是相同的
。我想访问源代码,而不是目标。再次感谢您,我以前尝试过,但问题是:正如您所知,
ProvideValue
函数只调用一次,因此,如果我们在运行时传递DataContext,就不可能检测到
DataContext
键入
ProvideValue
!再次感谢您,因为时间和精度。这是一个通过通知更改等进行的复杂处理。为此,我建议您从BindingBase类派生类,而不是MarkupExtension,因为大部分处理都在那里完成。