我试图找出在第一次加载控件时选择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的初始绑定更改文本时触发。
非常感谢任何想法!
答案 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(阅读评论)......