如何使用for next禁用数据绑定TextBox

时间:2012-09-03 07:24:39

标签: vb.net

以下代码仅禁用非数据绑定文本框。

Private Sub DisableFields()
    Dim ctrl As Control
    For Each ctrl In Me.Controls
        If TypeOf (ctrl) Is TextBox Then
            CType(ctrl, TextBox).Enabled = False
        End If
    Next
End Sub

1 个答案:

答案 0 :(得分:0)

这不是正确的方法。
您应该进入每个TextBox的xaml并将IsEnabled绑定到您放置在View Model / Code Behind中的属性(expl:AllowEdit)。 此属性必须引发NotifyPropertyChanged。 您甚至可以将其设置为TextBox的默认行为,方法是在Style或默认样式中设置绑定,如果需要在此处或那里覆盖,则可以设置IsEnabled =“true”。

编辑: 要遍历所有可用的TextBox,您需要使用VisualTreeHelper来遍历 视觉树:

  Public Sub ApplyOnAllDescendant(ByVal BaseUIElement As UIElement, 
                                      ByVal TargetType As Type, 
                                             ByVal NewIsEnabled As Boolean)
    If BaseUIElement Is Nothing Then Return
    If BaseUIElement.GetType() = TargetType Then
        BaseUIElement.IsEnabled = NewIsEnabled
    Else
        Dim ChildCount As Integer = VisualTreeHelper.GetChildrenCount(BaseUIElement)
        For i = 0 To ChildCount - 1
            ApplyOnAllDescendant(VisualTreeHelper.GetChild(BaseUIElement, i), 
                                           TargetType, NewIsEnabled)
        Next
    End If
  End Sub

你打电话:

      ApplyOnAllDescendant(Me, GetType(TextBox), False)

如果你想知道是否有绑定,你可以使用

Dim Bindings = CType(BaseUIElement, Control)
                                 .GetBindingExpression(TextBox.TextProperty)

然后查看Bindings的内容。

但同样,这不是一种“干净”的方式。