#wpf #binding #textbox #dataset #maxlength
#wpf #привязка #текстовое поле #набор данных #максимальная длина
Вопрос:
Я пытаюсь ограничить длину текстовых записей в нашем приложении WPF в соответствии с максимальной длиной поля в наших (типизированных) таблицах базы данных. Приложение использует наборы данных и подключается к базе данных Oracle с помощью ODP.NET.
Для улучшения удобства обслуживания и избавления нас от большой работы мы хотели бы привязать максимальную длину всех элементов управления TextBox к максимальной длине в соответствующем столбце текущей таблицы, который указан в DataSet.
Каков наиболее эффективный способ реализовать такое поведение в нашем случае?
Ответ №1:
У меня было точно такое же требование, и это то, что я придумал:
сохраните MaxLength как свойство в вашей виртуальной машине, а затем задайте свойство MaxLength ячейки с помощью EditingElementStyle столбца (при условии, что оно имеет тип DataGridTextBoxColumn):
в вашей виртуальной машине:
private static readonly DependencyProperty MaxLengthProperty = TextBox.MaxLengthProperty.AddOwner(typeof(MyCellVM));
internal int MaxLength
{
get { return (int)(GetValue(MaxLengthProperty)); }
set { SetValue(MaxLengthProperty, value); }
}
затем в конструкторе вашего столбца:
EditingElementStyle = new Style(typeof(TextBox));
EditingElementStyle.Setters.Add(new Setter(TextBox.MaxLengthProperty, new Binding(source "MaxLength") { Mode = BindingMode.OneWay }));
ПРИМЕЧАНИЕ: мне пришлось установить исходную переменную в конструкторе столбца следующим образом:
string source = String.Format(CultureInfo.InvariantCulture, "[{0}].", dataGrid.Columns.Count);
это сделано только потому, что я заполняю столбец datagrid’s во время выполнения и я заранее не знаю, сколько их будет, но если у вас фиксированная структура, это еще проще для вас, вы должны быть в состоянии адаптироваться, вы даже должны быть в состоянии поместить этот код в часть xaml.