为什么在我将文本设置为string.Empty后,我的文本框不清除文本?



我在MainWindow中设置了一个DataContext .

<Window.DataContext>
<viewmodel:MainViewModel/>
</Window.DataContext>

MainViewModel有一个属性叫做Message

class MainViewModel : ObservableObject
{
private string _message;
public string Message
{
get { return _message; }
set
{
_message = value;
OnPropertyChanged();
}
}
}

ObservableObject是超级简单的

class ObservableObject
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

我面临的问题是我的TextBox..正如我们在这里看到的,我目前将Text属性绑定到Message

<TextBox Text="{Binding Message, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
VerticalAlignment="Center"
Foreground="LightGray"
BorderThickness="0"
Margin="15,0,0,0"
Width="600"
TextWrapping="Wrap"
x:Name="MessageBox">
<TextBox.InputBindings>
<KeyBinding Key="Return"
Command="{Binding SendMessageCommand}"/>
</TextBox.InputBindings>
</TextBox>

的命令
SendMessageCommand = new RelayCommand(o =>
{
MessageBox.Show(Message);
Message = string.Empty;
});

和绑定工作得很好!唯一的问题是,当我将Message设置为""string.Empty时,它实际上并不反映在视图上。

让我们来看看这个例子,如果我在TextBox中输入"Hello"然后点击Enter它会显示一个MessageBox"Hello"的文本我们可以看到,如果我们查看命令,我将Message属性设置为string.Empty但是它不会更新TextBox的文本,它仍然会显示"Hello",这很奇怪,因为如果我再次点击回车它会显示一个空的MessageBox

为什么?这是臭虫吗?

您应该实现接口INotifyPropertyChanged:

class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

否则,你的视图不能订阅事件,这意味着当你的属性值发生变化时,视图永远不会被通知。

最新更新