¿Hay alguna forma de MVVM para seleccionar texto en un cuadro de texto? El marco de MVVM que estoy usando es MVVM Light Toolkit de Laurent Bugnion.MVVM- ¿Cómo puedo seleccionar texto en un cuadro de texto?
Respuesta
Cada vez que intento afectar directamente la Vista en una aplicación MVVM "pura" (sin código subyacente en la Vista), utilizaré Attached Properties para encapsular cualquier efecto que intente lograr. Crearé una interfaz que define las acciones que deseo realizar usando eventos personalizados. Luego implemento esta interfaz en cada ViewModel que "ejecutará" estos comandos en la Vista. Finalmente, vinculo mi ViewModel a la propiedad adjunta en mi definición de Vista. El siguiente código muestra cómo esto para SelectAll y un TextBox. Este código se puede expandir fácilmente para realizar casi cualquier acción en cualquier componente de la Vista.
mi propiedad y la interfaz adjunta definición:
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<ITextBoxController, TextBox> elements = new Dictionary<ITextBoxController, TextBox>();
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);
}
Mi definición modelo de vista:
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;
}
Mi Ver definición:
<Window x:Class="SelectAllSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:SelectAllSample"
Title="Window1" Height="150" Width="150">
<x:Code><![CDATA[
public Window1()
{
InitializeComponent();
DataContext = new MyViewModel();
}
]]></x:Code>
<StackPanel>
<TextBox Text="{Binding Value}" loc:TextBoxAttach.TextBoxController="{Binding}" />
<Button Content="Select All" Command="{Binding SelectAllCommand}" />
</StackPanel>
</Window>
Nota: Gracias a Josh Smith por RelayCommand (Vea el código en la Figura 3 en this page). Se usa en MyViewModel en este ejemplo (y casi todo mi código MVVM).
encontrar una buena introducción a las propiedades asociadas aquí: http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx
- 1. Seleccionar texto en un cuadro de texto deshabilitado en C#
- 2. ¿Cómo puedo seleccionar varios segmentos de texto en un cuadro de texto WPF?
- 3. C# ¿cómo puedo seleccionar todo el texto en un cuadro de texto cuando hago doble clic?
- 4. Cuadro de texto numérico con patrón MVVM
- 5. Cómo enfocar el cuadro de texto en WP7 usando MVVM?
- 6. Cómo vincular una propiedad a un cuadro de texto usando MVVM y MVVM toolkit?
- 7. cómo resaltar/seleccionar texto en un cuadro de texto wpf sin foco?
- 8. Uso de jQuery para resaltar (Seleccionar) Todo el texto en un cuadro de texto
- 9. Jquery fadeout texto en un cuadro de texto y texto
- 10. Cómo seleccionar texto en el bloque de texto Silverlight 3.0
- 11. texto fantasma - cómo tener en texto claro cuadro de texto
- 12. Seleccionar y copiar texto del cuadro de diálogo en wxPython
- 13. Obtener texto seleccionado en un cuadro de texto
- 14. Seleccionar ListBoxItem si Cuadro de texto en ItemTemplate obtiene foco
- 15. Anular la selección de texto en un cuadro de texto
- 16. ¿Cómo puedo seleccionar un cuadro de imagen?
- 17. ¿Puedo seleccionar texto mediante programación en UITextView?
- 18. Como llegar texto seleccionado de Javascript Seleccionar cuadro de
- 19. Ctrl + C en un cuadro de texto
- 20. Creando un cuadro de texto WPF Control como el cuadro de texto del destinatario de Outlook
- 21. El uso de un cuadro de texto HTML en lugar de un cuadro de texto ASP.NET
- 22. cómo configurar un texto en un texto de edición que está en un cuadro de diálogo?
- 23. Seleccionar texto en javascript
- 24. Cuadro de texto - centrado de texto
- 25. ¿Cómo puedo vincular un contenido de cuadro de lista seleccionado a un cuadro de texto?
- 26. Cuadro de texto enriquecido cómo resaltar el bloque de texto
- 27. Cuadro de texto árabe
- 28. ¿Cómo seleccionar todo el texto cuando el cuadro de texto de edición en un DataGridTemplateColumn recibe foco?
- 29. Cómo hacer un texto en negrita en un cuadro de texto enriquecido C#
- 30. Insertar pestañas en un cuadro de texto
Muchas gracias! – Justin
Me aparece un error: "Delegar 'System.Action' no toma 1 argumentos"? – Justin
¿Dónde está el error? Asegúrese de que el número de parámetros en la definición de su controlador de eventos sea consistente con la forma en que define su controlador (y úselo). Estoy usando un Lambda con RelayCommand para plantear el evento en mi ejemplo. –