문제

DataGridTextColumn의 MaxLength 속성을 어떻게 설정합니까?

도움이 되었습니까?

해결책

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

다음 동작을 사용하여 설정할 수도 있으므로 매번 스타일과 세터를 사용할 필요가 없습니다.

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" />

다른 팁

모든 열 사이에 공유 스타일이 있고 하나 이상의 스타일을 추가하려면 스타일을 사용할 수 있습니다 .Basedon 속성 :

 <DataGridTextColumn Binding="{Binding SomeProperty, UpdateSourceTrigger=PropertyChanged}" ElementStyle="{StaticResource CellErrorStyle}">
     <DataGridTextColumn.EditingElementStyle>
           <Style TargetType="TextBox" BasedOn="{StaticResource OriginalStyleKey}">
                <Setter Property="MaxLength" Value="5" />                            
           </Style>
     </DataGridTextColumn.EditingElementStyle>
 </DataGridTextColumn>
     <Window.Resources>
        <Style x:Key="sty_txtDesc" TargetType="TextBox">
            <Setter Property="MaxLength" Value="495" />
        </Style>
    </Window.Resources>


    for (int i = 0; i < miDataGridX.Columns.Count; i++)
    {
        if (miDataGridX.Columns[i].Header.ToString() == "Description")
        {
            ((DataGridTextColumn)miDataGridX.Columns[i]).EditingElementStyle = (Style)this.FindResource("sty_txtDesc");
        }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top