DataGridTextColumn.MaxLength?
-
20-09-2019 - |
Frage
Wie kann ich die MaxLength-Eigenschaft des Datagridtextcolumn gesetzt?
Lösung
<tk:DataGridTextColumn Binding="{Binding Text}">
<tk:DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="MaxLength" Value="16"/>
</Style>
</tk:DataGridTextColumn.EditingElementStyle>
</tk:DataGridTextColumn>
Sie können es auch eingestellt das folgende Verhalten verwenden, damit Sie nicht einen Stil und Setter jedes Mal verwenden müssen:
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
Verbrauch:
<ComboBox xmlns:loc="MyNamesapace" loc:TextBoxBehavior.MaxLength="50" />
Andere Tipps
Wenn Sie einen gemeinsamen Stil unter allen Spalten haben, und Sie möchten einen zusätzlichen Stil zu einem oder mehreren von denen hinzuzufügen, können Sie die Style.BasedOn Property verwenden:
<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");
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow