TextBox.TextChanged и ICommandSource
-
09-06-2019 - |
Вопрос
я слежу за М-В-ВМ шаблон для моего пользовательского интерфейса 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
это действует как источник команд, но это кажется излишним, если только вы не планируете делиться этим и использовать во многих местах.