MVVM-如何在文本框中选择文本?

是否有MVVM方式在文本框中选择文本? 我使用的MVVM框架是Laurent Bugnion的MVVM Light Toolkit。

每当我试图直接影响“纯”MVVM应用程序中的View(View中没有代码隐藏)时,我将使用附加属性来封装我想要实现的任何效果。 我将创建一个界面,用于定义我希望使用自定义事件执行的操作。 然后,我在每个ViewModel中实现此接口,该接口将在View上“运行”这些命令。 最后,我将ViewModel绑定到View定义中的附加属性。 以下代码显示了SelectAll和TextBox的配置方法。 可以轻松扩展此代码,以便对View中的任何组件执行任何操作。

我的附属属性和接口定义:

using System.Windows; using System.Windows.Controls; using System; using System.Collections.Generic; namespace SelectAllSample { public static class TextBoxAttach { public static readonly DependencyProperty TextBoxControllerProperty = DependencyProperty.RegisterAttached( "TextBoxController", typeof(ITextBoxController), typeof(TextBoxAttach), new FrameworkPropertyMetadata(null, OnTextBoxControllerChanged)); public static void SetTextBoxController(UIElement element, ITextBoxController value) { element.SetValue(TextBoxControllerProperty, value); } public static ITextBoxController GetTextBoxController(UIElement element) { return (ITextBoxController)element.GetValue(TextBoxControllerProperty); } private static readonly Dictionary elements = new Dictionary(); private static void OnTextBoxControllerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var element = d as TextBox; if (element == null) throw new ArgumentNullException("d"); var oldController = e.OldValue as ITextBoxController; if (oldController != null) { elements.Remove(oldController); oldController.SelectAll -= SelectAll; } var newController = e.NewValue as ITextBoxController; if (newController != null) { elements.Add(newController, element); newController.SelectAll += SelectAll; } } private static void SelectAll(ITextBoxController sender) { TextBox element; if (!elements.TryGetValue(sender, out element)) throw new ArgumentException("sender"); element.Focus(); element.SelectAll(); } } public interface ITextBoxController { event SelectAllEventHandler SelectAll; } public delegate void SelectAllEventHandler(ITextBoxController sender); } 

我的ViewModel定义:

 public class MyViewModel : ITextBoxController { public MyViewModel() { Value = "My Text"; SelectAllCommand = new RelayCommand(p => { if (SelectAll != null) SelectAll(this); }); } public string Value { get; set; } public RelayCommand SelectAllCommand { get; private set; } public event SelectAllEventHandler SelectAll; } 

我的视图定义:

        

注意:感谢Josh Smith的RelayCommand(参见本页图3中的代码)。 它在本例中的MyViewModel中使用(以及我的所有MVVM代码)。

在这里找到附加属性的一个很好的介绍: http : //www.codeproject.com/KB/WPF/AttachedBehaviors.aspx