Как передать текстовое поле в команде в качестве параметра WPF - PullRequest
0 голосов
/ 03 июня 2018

Итак, у меня есть мой MainWindow.xaml с текстовым полем.

<Window x:Class="HelloICommand.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        ...
    <Grid>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="337,195,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120">
            <TextBox.InputBindings>
                <KeyBinding Command="{Binding }" Key="Enter"></KeyBinding>
            </TextBox.InputBindings>
        </TextBox>
    </Grid>
</Window>

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

В моем MainWindow.cs я устанавливаю текст данных следующим образом.

public MainWindow()
        {
            InitializeComponent();
            DataContext = new ServerViewModel();
        }

А затем у меня есть фактическая ServerViewModel со всем остальным в нем Это где ястолкнуться с проблемой, как я могу передать текст из TextBox в этот метод прямо там, чтобы я мог видеть сообщение каждый раз, когда я нажимаю Enter.

class ServerViewModel
{
    private TextBoxCommand textCommand { get; private set; }
    public ServerViewModel()
    {
        textCommand = new TextBoxCommand(SendMessage);
    }

    //How do I pass the text from the textbox as a parameter here?
    public void SendMessage()
    {
        MessageBox.Show("");
    }
}

Интерфейс ICommand

class TextBoxCommand : ICommand
    {
        public Action _sendMethod;

        public TextBoxCommand(Action SendMethod)
        {
            _sendMethod = SendMethod;
        }
        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {

        }

        public event EventHandler CanExecuteChanged;
    }

1 Ответ

0 голосов
/ 03 июня 2018

Представление может связываться с командами, только если они являются общедоступными свойствами.Это означает, что первым шагом является определение вашей команды как открытого (только для чтения) свойства:

public TextBoxCommand TextCommand { get; }

Интерфейс ICommand позволяет передавать объект в качестве параметра его функции выполнения.Если ваша реализация команды TextBoxCommand позволяет передавать этот параметр, просто добавьте параметр в ваш метод, приведите его в виде строки и покажите ваше сообщение:

private void SendMessage(object parameter)
{
    MessageBox.Show((string)parameter);
}

Если ваш TextBoxCommand не позволяетчтобы передать параметр, простая реализация, как показано на Как реализовать повторно используемую ICommand , добьется цели.Просто замените TextBoxCommand на DelegateCommand учебного пособия.

Чтобы выполнить команду правильно с вашего взгляда, вам теперь нужно привязать команду к свойству TextCommand.Второй шаг - установить текст текстового поля в качестве параметра команды.С этим именем вы можете связать свойство Text и передать их в качестве параметра вашей команде.Поэтому вам нужно назвать свое текстовое поле.Вот минимальный пример:

<TextBox x:Name="yourTextBox>
    <TextBox.InputBindings>
        <KeyBinding Key="Enter"
                    Command="{Binding TextCommand}"
                    CommandParameter="{Binding Text, ElementName=yourTextBox}"/>
    </TextBox.InputBindings>
</TextBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...