MVVM-, Как я могу выбрать текст в текстовом поле?

Существует ли способ MVVM выбрать текст в текстовом поле? Платформа MVVM, которую я использую, является Легким Инструментарием Laurent Bugnion MVVM.

14
задан Justin 8 April 2010 в 00:15
поделиться

2 ответа

Всякий раз, когда я пытаюсь напрямую повлиять на представление в "чистом виде" "Приложение MVVM (без кода программной части в представлении), я буду использовать Attached Properties , чтобы инкапсулировать любой эффект, который я пытаюсь достичь. Я создам интерфейс, который определяет действия, которые я хочу предпринять, используя настраиваемые события. Затем я реализую этот интерфейс в каждой ViewModel, который будет «запускать» эти команды в View. Наконец, я привязываю свою ViewModel к присоединенному свойству в моем определении View. В следующем коде показано, как это сделать для SelectAll и TextBox. Этот код можно легко расширить для выполнения практически любых действий с любым компонентом в представлении.

Мое присоединенное свойство и определение интерфейса:

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);
}

Определение моей модели представления:

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;
}

Определение моего представления:

<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>

Примечание: Спасибо Джошу Смиту за RelayCommand (см. Код на рисунке 3 на этой странице ). Он используется в MyViewModel в этом примере (и почти во всем моем коде MVVM).

20
ответ дан 1 December 2019 в 12:51
поделиться

найдите хорошее представление о прикрепленных свойствах здесь: http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx

1
ответ дан 1 December 2019 в 12:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: