Параметр команды wpf из другого объекта

Мне интересно, как разметить XAML для следующего. У меня есть модель представления с объектом, основанным на ICommand.

У меня есть форма с текстовым полем и кнопкой. Кнопка подключается к объекту ICommand через Command="{Binding MyButtonInViewModel}".

То, что я хочу сделать, это установить для кнопки CommandParameter равное тому, что есть в тексте текстового поля, например, для вызова "поиска", но, очевидно, не знаю, как перехватить элементы управления в представлении.

Ответ 1

Следующий XAML должен работать, чтобы передать текст из TextBox в качестве параметра в вашу команду.

<TextBlock x:Name="searchBox" />

<Button Command="{Binding MyButtonInViewModel}" 
        CommandParameter="{Binding Text, ElementName=searchBox}"/>

Ответ 2

Вы можете сделать это, установив ElementName в привязку. Вот пример:

<TextBox x:Name="textBox"/>
<Button Content="Button" 
        Command="{Binding ButtonCommand}" 
        CommandParameter="{Binding ElementName=textBox, Path=Text}"/>

Ответ 3

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

<TextBox x:Name="searchBox" />

<Button Command="{Binding MyButtonInViewModel}"
        CommandParameter="{Binding ElementName=searchBox}" />

Просмотр кода модели

private void SearchStuff(TextBox searchBox)
{
    //do stuff with searchBox.Text
    searchBox.Text = "";
}

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