Команды в UserControl. Зачем нужны параметры в разметке

202
04 декабря 2017, 14:25

А теперь вопрос по командам... Что-то мне кажется я зачастил.

Итак, если 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 присутствует

Answer 1

Начнём немного издалека, команды используют в основном, чтобы отделить codebehind и саму логику приложения. Посему очень часто и используют сам паттерн MVVM. Сначала отвечу на ваши вопросы:

  • Зачем в разметке нужно указывать параметры у команды? Где и как это может пригодиться?

Для того, чтобы передать что-то из разметки в саму бизнес логику. К примеру, вам нужно передать пароль в метод авторизации, сам PasswordBox не даёт вам возможности привязать его поле Password к бизнес логике, посему, нужно его передать. Дав имя элементу, например PasswordTB, вы можете через CommandParameter указать что вам нужно передать, например если нужно указать только поле пароля, то это делается так:

<Button Command="{Binding Authentificate}" CommandParameter="{Binding ElementName = PasswordTB, Path = Password}"/>

Пожалуй, тут все с ответом. Но, будет встречный вопрос, для чего вам своя реализация с "автоподтягиванием" текста из этого элемента? Если вам вдруг понадобится вытаскивать из других элементов что-то, то вы снова создадите новую реализацию?

READ ALSO
Как перевести текст с например С# на Pascal

Как перевести текст с например С# на Pascal

Я мирно сидел, писал свои программыКак вдруг я понял что не могу решить одну проблему

161
Ошибка BadimageFormatException

Ошибка BadimageFormatException

При переносе с одного компьютера на другой проекта, при загрузке выскакивает ошибка BadimageFormatExceptionПрошу помощи

162