0

下面给出的代码仅禁用非数据绑定文本框。

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
4

1 回答 1

0

这不是正确的做法。
您应该进入每个 TextBox 的 xaml 并将 IsEnabled 绑定到您放入视图模型/代码后面的属性(expl:AllowEdit)。此属性必须引发 NotifyPropertyChanged。您甚至可以将其设置为 TextBox 的默认行为,方法是在 Style 或默认 Style 中设置绑定,如果您需要在这里或那里覆盖,您可以设置 IsEnabled="true"。

编辑:要遍历所有可用的文本框,您需要使用 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的内容。

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

于 2012-09-03T08:59:09.047 回答