代码之家  ›  专栏  ›  技术社区  ›  Dan Auclair

在Silverlight文本框中选择初始文本

  •  2
  • Dan Auclair  · 技术社区  · 14 年前

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

    我会怎么做 喜欢做的事情是这样的:

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

    基本上只需使用整个文本作为一次绑定的SelectedText。但是,这不起作用,因为SelectedText不是dependencProperty。

    任何想法都非常感谢!

    3 回复  |  直到 14 年前
        1
  •  3
  •   Kit    12 年前

    丹,

    我编写了一个非常简单的派生类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" />
    

    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
  •  2
  •   Dan Auclair    14 年前

    SelectAll() 在文本框的GotFocus事件上实现了这个技巧。

    实际上,我最终制作了一个Blend TriggerAction和一个EventTrigger来实现这一点,而不是将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();
            }
        }
    }
    
        3
  •  1
  •   Rodney    14 年前

    fantastic discussion (阅读评论)关于行为vs子类化vvs附加属性。。。