Я хочу добиться того, чтобы в 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
Как настроить WPF DataGridTextColumn так, чтобы он принимал только значения времени ⇐ C#
Место общения программистов C#
1727332830
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);
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79023302/how-to-customize-wpf-datagridtextcolumn-to-only-accept-time-values[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия