Comments 9
Как правило в конце класса добавляют слово Behavior если это Behavior
msdn.microsoft.com/en-us/library/ff726531%28v=Expression.40%29.aspx — ссылка не вставилась.
Мне почудилось или вот это, действительно, не будет работать как надо?
textBox.Text.Replace(textBox.SelectedText, e.Text);
Что произойдет, если в строке «111» выделить, скажем, вторую единицу и нажать двойку?
textBox.Text.Replace(textBox.SelectedText, e.Text);
Что произойдет, если в строке «111» выделить, скажем, вторую единицу и нажать двойку?
Да, вы правы. В приведенном случае мы правда получим «222», но это не будет проблемой, поскольку текст будет валидным и в том и в другом случае (да, это плохо, но не смертельно).
А вот если в текст боксе каким-то образом попадет невалидный текст, например «ааа», то при выделении любого из символов «а» и нажатием на «1», мы получим «111», что пройдет валидацию текста, в результате мы получим «1аа».
Более корректно реализовать метод CreateFullText как-то так:
Т.е. вначале «снести» выделенный текст, а уже потом вставить новый текст согласно положению курсора.
А вот если в текст боксе каким-то образом попадет невалидный текст, например «ааа», то при выделении любого из символов «а» и нажатием на «1», мы получим «111», что пройдет валидацию текста, в результате мы получим «1аа».
Более корректно реализовать метод CreateFullText как-то так:
private static string CreateFullText(TextBox textBox, string inputText)
{
string text;
if (textBox.SelectionLength > 0)
{
// Replacing text box's selected text with text from clipboard
text = textBox.Text.Remove(textBox.CaretIndex, textBox.SelectionLength);
text = text.Insert(textBox.CaretIndex, inputText);
}
else
{
// If we don't have selected text we should insert clipboard text
// into the caret index.
text = textBox.Text.Insert(textBox.CaretIndex, inputText);
}
return text;
}
Т.е. вначале «снести» выделенный текст, а уже потом вставить новый текст согласно положению курсора.
Вообще-то, правильнее создать наследника от TextBox, тем самым перестав прямо зависеть от логики работы TextBox, и спрятать его в наследнике, например, TextBoxExt, далее в коде C# определить свойства на базе которых будет проверяться корректность (напр., AllowEmpty — допускается ли пустое значение). Можно сделать более глубокую иерархию сделав наследников NumberBox, MoneyBox и т.п. Тогда в XAML более точно расставляются те контролы, которые нужно — где ввод текст, где чисел с плавающей запятой, а где деньги. А такие свойства как AllowEmpty, и прочие, которые зависят от бизнес-логики — лучше задавать в коде C#, а не статически в XAML. Имеем куда больше гибкости и ясности, где что.
Да, и еще используем интерфейс IDataErrorInfo — проче и не надо городить огород как в предлагаемом решении.
Или к биндингу правила прикрепить на входящие значения:
msdn.microsoft.com/ru-ru/library/system.windows.data.binding.validationrules.aspx
Это еще проще, в случае статических проверок (соответствие определеному формату, регулярке, типу и т.д.). если нужно привязываться к данным модели, то тогда, как написали выше, IDataErrorInfo или самописный аналог =)
msdn.microsoft.com/ru-ru/library/system.windows.data.binding.validationrules.aspx
Это еще проще, в случае статических проверок (соответствие определеному формату, регулярке, типу и т.д.). если нужно привязываться к данным модели, то тогда, как написали выше, IDataErrorInfo или самописный аналог =)
Sign up to leave a comment.
Attached свойства для ограничения текстового ввода