在Silverlight TextBox中选择初始文本

时间:2010-03-17 18:31:26

标签: silverlight data-binding textbox viewmodel selectedtext

我试图找出在第一次加载控件时选择TextBox中所有文本的最佳方法。我正在使用MVVM模式,所以我使用TextBox的Text属性的双向绑定到我的ViewModel上的字符串。我正在使用这个TextBox来“重命名”已经有名字的东西,因此我想在控件加载时选择旧名称,以便可以轻松删除和重命名。通过在我的ViewModel中设置初始文本(旧名称)来填充它,然后在数据绑定完成后将其反映在TextBox中。

真正喜欢做的事情是这样的:

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

基本上只需将整个文本用作具有OneTime绑定的SelectedText。但是,由于SelectedText不是DependencyProperty,因此不起作用。

我并不完全反对在我的视图的代码隐藏中添加选择代码,但在这种情况下我的问题是确定初始文本绑定何时完成。 TextBox始终为空,因此无法在构造函数中完成。 TextChanged事件似乎仅在用户输入新文本时触发,而不是在从ViewModel的初始绑定更改文本时触发。

非常感谢任何想法!

3 个答案:

答案 0 :(得分:3)

丹,

我写了一个非常简单的派生类TextBoxEx,它提供了这个功能。 TextBoxEx类派生自TextBox,可以在XAML中为任何和所有TextBox引用。没有方法可以打电话。它只是监听Focus事件并选择它自己的文本。非常简单。

用法如下:

在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();
        }
    }
}
祝你好运。

答案 1 :(得分:2)

我将离开Jim的解决方案作为答案,因为在TextBox的GotFocus事件上调用SelectAll()就可以了。

我实际上最终制作了一个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();
        }
    }
}

答案 2 :(得分:1)

只想添加一个我发现的与此相关的链接 - 这是关于行为与子类化vvs附加属性的fantastic discussion(阅读评论)......