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,因为大部分处理都在那里完成。