Вопрос

я слежу за М-В-ВМ шаблон для моего пользовательского интерфейса WPF.Я хотел бы подключить команду к событию TextChanged TextBox к команде, которая находится в моем классе ViewModel.Единственный способ выполнить эту задачу — это наследовать элемент управления TextBox и реализовать ICommandSource.Затем я могу указать, что команда будет запущена из события TextChanged.Кажется, это слишком большая работа для чего-то, что кажется таким простым.

Есть ли более простой способ (чем создание подкласса TextBox и реализация ICommandSource) подключить событие TextChanged к моему классу ViewModel?

Это было полезно?

Решение

Во-первых, вы наверняка рассматривали возможность двусторонней привязки данных к вашей модели представления с помощью UpdateSourceTrigger PropertyChanged?Таким образом, установщик свойства, к которому вы привязываетесь, будет вызываться каждый раз при изменении текста?

Если этого недостаточно, я бы решил эту проблему с помощью Attached Behaviours.В блоге Хулиана Домингеса вы найдете статья о том, как сделать что-то очень похожее в Silverlight, который легко адаптировать к WPF.

По сути, в статическом классе (называемом, скажем, TextBoxBehaviours) вы определяете присоединенное свойство, называемое (возможно) TextChangedCommand типа ICommand.Подключите обработчик OnPropertyChanged для этого свойства и внутри обработчика убедитесь, что свойство устанавливается в TextBox;если это так, добавьте обработчик к событию TextChanged в текстовом поле, которое будет вызывать команду, указанную в свойстве.

Затем, предполагая, что ваша модель представления назначена DataContext вашего представления, вы должны использовать ее следующим образом:

<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />

Другие советы

Использование метода привязки событий и команд может быть неправильным.Что именно будет делать эта команда?

Возможно, вы захотите использовать привязку данных к строковому полю в вашей виртуальной машине.Таким образом, вы можете вызвать команду или функцию оттуда, вместо того, чтобы вообще заботиться о пользовательском интерфейсе.

<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}

Можете ли вы просто обработать событие TextChanged и выполнить команду оттуда?

private void _textBox_TextChanged(object sender, EventArgs e)
{
    MyCommand.Execute(null);
}

Альтернатива, как вы говорите, состоит в том, чтобы создать TextBox это действует как источник команд, но это кажется излишним, если только вы не планируете делиться этим и использовать во многих местах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top