Выберите начальный текст в текстовом поле Silverlight - PullRequest
2 голосов
/ 17 марта 2010

Я пытаюсь найти лучший способ выделить весь текст в TextBox при первой загрузке элемента управления. Я использую шаблон MVVM, поэтому я использую двустороннее связывание для свойства Text объекта TextBox со строкой в ​​моей ViewModel. Я использую этот TextBox для «переименования» чего-то, у кого уже есть имя, поэтому я хотел бы выбрать старое имя при загрузке элемента управления, чтобы его можно было легко удалить и переименовать. Исходный текст (старое имя) заполняется путем установки его в моей ViewModel, а затем он отражается в TextBox после завершения привязки данных.

То, что я бы действительно хотел бы сделать, выглядит примерно так:

<TextBox x:Name="NameTextBox" Text="{Binding NameViewModelProperty, Mode=TwoWay}" SelectedText="{Binding NameViewModelProperty, Mode=OneTime}" />

В основном просто используйте весь текст в качестве SelectedText с привязкой OneTime. Однако это не работает, поскольку SelectedText не является DependencyProperty.

Я не совсем против добавления кода выбора в коде моего представления, но моя проблема в этом случае заключается в определении того, когда начальная привязка текста завершена. TextBox всегда начинается пустым, поэтому это не может быть сделано в конструкторе. Кажется, что событие TextChanged срабатывает только тогда, когда пользователь вводит новый текст, а не когда текст изменяется по сравнению с начальной привязкой ViewModel.

Любые идеи очень ценятся!

Ответы [ 3 ]

3 голосов
/ 18 марта 2010

Dan

Я написал очень простой производный класс TextBoxEx, который предлагает эту функциональность. Класс TextBoxEx является производным от TextBox, и на него можно ссылаться в XAML для любого и всех ваших TextBox. Нет методов для вызова. Он просто слушает события Фокуса и выбирает собственный текст. Очень просто.

Использование выглядит следующим образом:

В XAML, обратитесь к сборке, в которой вы реализуете класс TextBoxEx, указанный ниже, и добавьте столько элементов TextBoxEx, сколько вам нужно. В приведенном ниже примере используется привязка данных для отображения имени пользователя.

<UserControl x:Class="MyApp.MainPage"
    xmlns="http://schemas.microsoft.com/client/2007"     
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     
    xmlns:c="clr-namespace:ClassLibrary;assembly=ClassLibrary"  
>  
.     
.     
.     
<c:TextBoxEx x:Name="NameTextBox" Text="{Binding NameViewModelProperty, Mode=TwoWay}" Width="120" />

Этот код ниже работает с Silverlight 3.

using System.Windows;
using System.Windows.Controls;

namespace ClassLibrary
{
    // This TextBox derived class selects all text when it receives focus
    public class TextBoxEx : TextBox
    {
        public TextBoxEx()
        {
            base.GotFocus += OnGotFocus;
        }

        private void OnGotFocus(object sender, RoutedEventArgs e)
        {
            base.SelectAll();
        }
    }
}

Удачи.

2 голосов
/ 18 марта 2010

Я оставляю решение Джима в качестве ответа, поскольку вызов SelectAll() для события GotFocus в TextBox сделал свое дело.

Я фактически закончил тем, что сделал Blend TriggerAction и EventTrigger, чтобы сделать это вместо того, чтобы создавать подклассы TextBox или делать это в коде. Это было действительно просто и приятно иметь возможность хранить логику поведения в инкапсуляции и просто декларативно добавлять ее в XAML в существующий TextBox.

Просто опубликуйте это на тот случай, если кто-нибудь еще натолкнется на эту тему и будет заинтересован:

XAML:

<TextBox x:Name="NameTextBox" Text="{Binding NameViewModelProperty, Mode=TwoWay}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="GotFocus">
            <local:SelectAllAction/>
        </i:EventTrigger>
     </i:Interaction.Triggers>
</TextBox>

C #

public class SelectAllAction : TriggerAction<TextBox>
{
    protected override void Invoke(object parameter)
    {
        if (this.AssociatedObject != null)
        {
            this.AssociatedObject.SelectAll();
        }
    }
}
1 голос
/ 13 июля 2010

Просто хочу добавить ссылку, которую я нашел, относящуюся к этому - вот фантастическое обсуждение (читай комментарии) о поведении по сравнению с вложенными классами и вложенными свойствами ...

...