Как настроить WPF DataGridTextColumn так, чтобы он принимал только значения времениC#

Место общения программистов C#
Ответить
Anonymous
 Как настроить WPF DataGridTextColumn так, чтобы он принимал только значения времени

Сообщение Anonymous »

Я хочу добиться того, чтобы в DataGrid столбец отображал значения TimeSpan как чч: мм, и пользователи могли вводить значения только в таком формате. Некоторое время назад я сделал это с TextBox, реализовав пользовательский элемент управления, инкапсулирующий TextBox, и IValueConverter, который заботится о преобразовании значений.
Однако недавно я прочитал, что пользовательские элементы управления должны быть последним средством, и есть более простые способы, такие как использование присоединенных свойств. Я нашел этот подход для текстовых полей (https://stackoverflow.com/a/34085735/5772806), но не могу адаптировать его к DataGridColumns, поскольку BindingExpression не является частью DataGridTextColumn, а является частью его вложенного текстового поля.
Вот что у меня есть на данный момент:
public static class DataGridTimeColumnBehavior
{
public static readonly DependencyProperty IsTimeColumnProperty =
DependencyProperty.RegisterAttached(
"IsTimeColumn",
typeof(bool),
typeof(DataGridTimeColumnBehavior),
new PropertyMetadata(false, OnIsTimeColumnChanged));

public static bool GetIsTimeColumn(DependencyObject obj)
{
return (bool)obj.GetValue(IsTimeColumnProperty);
}

public static void SetIsTimeColumn(DependencyObject obj, bool value)
{
obj.SetValue(IsTimeColumnProperty, value);
}

private static readonly DependencyProperty OriginalBindingExpressionProperty = DependencyProperty
.RegisterAttached(
"OriginalBindingExpression", typeof(BindingExpression), typeof(TextBoxExtensions),
new PropertyMetadata(default(BindingExpression)));

private static void SetOriginalBindingExpression(DependencyObject element, BindingExpression value)
{
element.SetValue(OriginalBindingExpressionProperty, value);
}

private static BindingExpression GetOriginalBindingExpression(DependencyObject element)
{
return (BindingExpression)element.GetValue(OriginalBindingExpressionProperty);
}

private static void OnIsTimeColumnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is DataGridTextColumn column)
{
if (GetOriginalBindingExpression(column) == null)
{
// DataGridTextColumn does not contain a definition for GetBindingExpression
SetOriginalBindingExpression(column, column.GetBindingExpression(TextBox.TextProperty));
}
BindingExpression bindingExpression = GetOriginalBindingExpression(column);

Binding parentBinding = bindingExpression.ParentBinding;
Binding newBinding = new Binding(parentBinding.Path.Path)
{
ElementName = parentBinding.ElementName,
Path = parentBinding.Path,
Mode = parentBinding.Mode,
Converter = new TimeSpanStringConverter(),
UpdateSourceTrigger = parentBinding.UpdateSourceTrigger,
};
foreach (ValidationRule validationRule in parentBinding.ValidationRules)
{
newBinding.ValidationRules.Add(validationRule);
}
// DataGridTextColumn does not contain a definition for SetBinding
column.SetBinding(TextBox.TextProperty, newBinding);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... ime-values
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»