所以我的 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;
}
视图只能绑定到公共属性的命令。这意味着第一步是将您的命令定义为公共(只读)属性:
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>