我的MainWindow上有一个TextBox控件。
<Grid>
<TextBox x:Name="messageBox" Margin="252,89,277,300">
<TextBox.InputBindings>
<KeyBinding Key="Enter"
Command="{Binding TextCommand}"
CommandParameter="{Binding Text, ElementName=messageBox}"/>
</TextBox.InputBindings>
</TextBox>
</Grid>
正如你所看到的,当我点击Enter时,我已经绑定了Enter
密钥,它将使用我在TextBox中提供的文本提交一个MessageBox。
我的问题是..按Enter后如何清除文本框?我不想在控件上调用一个事件,因为这会破坏MVVM的目的,它也会混乱我的MainWindow.cs
正如您所看到的,我已经在我的MainWindow中设置了DataContext。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ServerViewModel();
}
}
这是我的ServerViewModel.cs
class ServerViewModel : INotifyPropertyChanged
{
public TextBoxCommand TextCommand { get; }
public ServerViewModel()
{
TextCommand = new TextBoxCommand(SendMessage);
}
private void SendMessage(string parameter)
{
MessageBox.Show(parameter);
parameter = "";
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
这个命令值得一看。
class TextBoxCommand : ICommand
{
public Action<string> _sendMethod;
public TextBoxCommand(Action<string> SendMethod)
{
_sendMethod = SendMethod;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_sendMethod.Invoke((string)parameter);
}
public event EventHandler CanExecuteChanged;
}
答案 0 :(得分:2)
您可以将TextBox绑定到ViewModel上的属性,并通过将该属性设置为空来重置TextBox。
绑定:
<TextBox x:Name="messageBox" Text="{Binding TextBoxInput, Mode=TwoWay}">
ViewModel中的新属性:
public string TextBoxInput
{
get { return _textBoxInput; }
set
{
_textBoxInput = value;
OnPropertyChanged(nameof(TextBoxInput));
}
}
private string _textBoxInput;
TextBox在此处重置:
private void SendMessage(string parameter)
{
MessageBox.Show(parameter);
TextBoxInput = "";
}