wpf - DataGridTextColumn.MaxLength?

标签 wpf wpftoolkit wpfdatagrid maxlength datagridtextcolumn

如何设置DataGridTextColumn的MaxLength属性?

最佳答案

<tk:DataGridTextColumn Binding="{Binding Text}">
    <tk:DataGridTextColumn.EditingElementStyle>
        <Style TargetType="TextBox">
            <Setter Property="MaxLength" Value="16"/>
        </Style>
    </tk:DataGridTextColumn.EditingElementStyle>
</tk:DataGridTextColumn>

您也可以使用以下行为进行设置,因此不必每次都使用样式和 setter :
Public Class TextBoxBehavior
    Private Shared Types As Type() = New Type() {GetType(AutoCompleteBox), GetType(ComboBox), GetType(DataGridTextColumn)}

    Public Shared Function GetMaxLength(ByVal element As DependencyObject) As Integer
        Return element.GetValue(MaxLengthProperty)
    End Function

    Public Shared Sub SetMaxLength(ByVal element As DependencyObject, ByVal value As Integer)
        element.SetValue(MaxLengthProperty, value)
    End Sub

    Private Shared Sub ValidateElement(ByVal element As DependencyObject)
        If element Is Nothing Then Throw New ArgumentNullException("element")
        If Not Types.Contains(element.GetType) Then Throw New NotSupportedException("The TextBoxBehavior is not supported for the given element")
    End Sub

    Public Shared ReadOnly MaxLengthProperty As DependencyProperty = 
     DependencyProperty.RegisterAttached("MaxLength", 
                        GetType(Integer), GetType(TextBoxBehavior), 
                        New FrameworkPropertyMetadata(Integer.MaxValue, AddressOf TextBox_MaxLengthChanged))

    Private Shared Sub TextBox_MaxLengthChanged(ByVal sender As Object, ByVal e As DependencyPropertyChangedEventArgs)
        If sender Is Nothing Then Exit Sub

        Dim value = DirectCast(e.NewValue, Integer)

        If TypeOf sender Is AutoCompleteBox Then
            Dim acb = DirectCast(sender, AutoCompleteBox)

            If acb.IsLoaded Then
                Dim tb = DirectCast(acb.Template.FindName("Text", acb), TextBox)
                tb.MaxLength = value
            Else
                acb.AddHandler(AutoCompleteBox.LoadedEvent, New RoutedEventHandler(AddressOf Element_Loaded))
            End If
        ElseIf TypeOf sender Is ComboBox Then
            Dim cb = DirectCast(sender, ComboBox)
            If cb.IsLoaded Then
                Dim tb = DirectCast(cb.Template.FindName("PART_EditableTextBox", cb), TextBox)
                tb.MaxLength = value
            Else
                cb.AddHandler(ComboBox.LoadedEvent, New RoutedEventHandler(AddressOf Element_Loaded))
            End If
        ElseIf TypeOf sender Is DataGridTextColumn Then
            Dim dgtc = DirectCast(sender, DataGridTextColumn)

            Dim setter = GetIsMaxLengthSet(dgtc.EditingElementStyle)
            If setter Is Nothing Then
                Dim style = New Style(GetType(TextBox), dgtc.EditingElementStyle)
                style.Setters.Add(New Setter(TextBox.MaxLengthProperty, value))
                dgtc.EditingElementStyle = style
                style.Seal()
            Else
                setter.Value = value
            End If
        End If
    End Sub

    Private Shared Function GetIsMaxLengthSet(ByVal style As Style) As Setter
        If style Is Nothing Then Return Nothing
        Dim setter = style.Setters.LastOrDefault(Function(s) TypeOf s Is Setter AndAlso DirectCast(s, Setter).Property Is TextBox.MaxLengthProperty)
        If setter IsNot Nothing Then Return setter Else Return GetIsMaxLengthSet(style.BasedOn)
    End Function

    Private Shared Sub Element_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim ml = GetMaxLength(sender)
        TextBox_MaxLengthChanged(sender, New DependencyPropertyChangedEventArgs(TextBox.MaxLengthProperty, -1, ml))
        sender.RemoveHandler(FrameworkElement.LoadedEvent, New RoutedEventHandler(AddressOf Element_Loaded))
    End Sub
End Class

用法:
<ComboBox xmlns:loc="MyNamesapace" loc:TextBoxBehavior.MaxLength="50" />

关于wpf - DataGridTextColumn.MaxLength?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1736753/

相关文章:

wpf - 在WPF应用程序中查找所有打开的弹出窗口

WPF Grid - 如何只为一列应用样式?

wpf - 如何在共享资源中重用 VisualState、VisualStateGroup 和 VsualStateManager?

WPF 数据网格行水平对齐问题

c# - 多个 DataGrid 列标题的绑定(bind)

c# - 从 View 模型中获取列表中的选定项目

wpf - WPF 应用程序中的 IIS 平滑流式处理

c# - WPF ComboBox/ListBox with MultiSelect 基于 Enum with Flags

c# - 使用 MVVM 的 BusyIndi​​cator

c# - 如何在 WPF 工具包数据网格控件中设置水平网格线的粗细?