А теперь вопрос по командам... Что-то мне кажется я зачастил.
Итак, если SearchBox - это UserControl, который содержит в себе TextBox(на самом деле InputBox - тоже UserControl, который расширяет стандартный TextBox возможностью устанавливать placeholder) и Button. Мне нужно реализовать команду, которая будет срабатывать каждый раз, когда у SearchBox изменяется текст.
Я сделал так: 1. В codebehind объявил команду:
public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(
"Command",
typeof( ICommand ),
typeof( SearchBox ) );
public ICommand Command
{
get { return (ICommand)GetValue( CommandProperty ); }
set { SetValue( CommandProperty, value ); }
}
Подписался на событие TextChanged у TextBox'а:
private void InputBox_TextChanged(object sender, TextChangedEventArgs e)
{
Command?.Execute( Text );
}
Вопрос. Зачем в разметке нужно указывать параметры у команды? Где и как это может пригодиться? В моем случае, пользователь моего SearchBox'а вообще не должен подвязывать какие-то параметры к команде:
<local:SearchBox Command="{Binding SomeCommand}"/>
Но при этом он должен знать, что при выполнении этой команды, если мы сделаем стандартную обертку RelayCommand
, в параметре обработчика будет текст, который в данный момент в SearchBox присутствует
Начнём немного издалека, команды используют в основном, чтобы отделить codebehind и саму логику приложения. Посему очень часто и используют сам паттерн MVVM. Сначала отвечу на ваши вопросы:
Зачем в разметке нужно указывать параметры у команды? Где и как это может пригодиться?
Для того, чтобы передать что-то из разметки в саму бизнес логику. К примеру, вам нужно передать пароль в метод авторизации, сам PasswordBox не даёт вам возможности привязать его поле Password к бизнес логике, посему, нужно его передать. Дав имя элементу, например PasswordTB
, вы можете через CommandParameter
указать что вам нужно передать, например если нужно указать только поле пароля, то это делается так:
<Button Command="{Binding Authentificate}" CommandParameter="{Binding ElementName = PasswordTB, Path = Password}"/>
Пожалуй, тут все с ответом. Но, будет встречный вопрос, для чего вам своя реализация с "автоподтягиванием" текста из этого элемента? Если вам вдруг понадобится вытаскивать из других элементов что-то, то вы снова создадите новую реализацию?
Виртуальный выделенный сервер (VDS) становится отличным выбором
Я мирно сидел, писал свои программыКак вдруг я понял что не могу решить одну проблему
При переносе с одного компьютера на другой проекта, при загрузке выскакивает ошибка BadimageFormatExceptionПрошу помощи