如何将命令中的文本框文本作为参数WPF传递

问题描述 投票:0回答:1

所以我的 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>

正如您所看到的,我想将我的 Enter 键绑定到可以单击 Enter 的位置,它会显示一个消息框,其中包含文本框中的文本。

在我的 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("");
    }
}

I命令接口

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;
    }
c# .net wpf mvvm command
1个回答
2
投票

视图只能绑定到公共属性的命令。这意味着第一步是将您的命令定义为公共(只读)属性:

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>
    
© www.soinside.com 2019 - 2024. All rights reserved.