Pull to refresh

Comments 9

Как правило в конце класса добавляют слово Behavior если это Behavior
А у меня класс и называется TextBoxBehavior. Или вы не об этом?
Я к тому, что это Helper, Extension, Extender. Behavior как правило указывает, что класс наследуется от Behavior, хотя конечно, так его тоже можно назвать.
Мне почудилось или вот это, действительно, не будет работать как надо?

textBox.Text.Replace(textBox.SelectedText, e.Text);

Что произойдет, если в строке «111» выделить, скажем, вторую единицу и нажать двойку?
Да, вы правы. В приведенном случае мы правда получим «222», но это не будет проблемой, поскольку текст будет валидным и в том и в другом случае (да, это плохо, но не смертельно).

А вот если в текст боксе каким-то образом попадет невалидный текст, например «ааа», то при выделении любого из символов «а» и нажатием на «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 или самописный аналог =)
Sign up to leave a comment.

Articles